如何包装 POST 请求的主体以便能够发送受限字符
How to wrap the body of a POST request in order to be able to send restricted characters
使用 powershell 从外部服务获取用户的当前令牌我没有问题:
$uri = "http://myserver/fmetoken/view"
$postParams = @{user='Myuser';password='PS78U-w&';}
$foo = Invoke-WebRequest -Uri $uri -Method Post -Body $postParams
$foo.Content
我收到令牌。
如果我用postman验证,没有问题。
但如果我想在 C# 中实现相同的操作,响应是:
'The remote server returned an error: (401) Unauthorized.' 当密码包含 '&' 和 '=' 等字符时
var url = $"{fmeServerUrl}/fmetoken/view";
var body = $"user={settingsUserFme}&password={settingsPasswordFme}";
var byteArray = Encoding.UTF8.GetBytes(body);
var responseCode = 0;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Credentials = CredentialCache.DefaultCredentials;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream()))
{
responseresult = reader.ReadToEnd();
reader.Close();
}
我已经尝试使用:
var bodyencoded = System.Net.WebUtility.UrlEncode(body);
var byteArray = Encoding.UTF8.GetBytes(bodyencoded);
但在这种情况下,我收到了一个错误的请求
如果您对整个 body
进行 UrlEncode,正文中旨在帮助解析的 & 和 = 字符将被丢弃,因此您的请求将变成如下内容:
user=Myuser&password=PS78U-w&
user=Myuser%26password=PS78U-w%26 // post UrlEncode
所以服务器假设您发送的是一个非常长的用户名,而不是两个不同的参数。
为避免这种情况,您可以单独对密码参数进行 UrlEncode,然后将其放入您的 body
变量中。
var passencoded = System.Net.WebUtility.UrlEncode(pass)
var body = $"user={settingsUserFme}&password={passencoded}";
结果应该是:user=Myuser&password=PS78U-w%26
,注意 password
之前的 & 符号是重要的并被保留。
使用 powershell 从外部服务获取用户的当前令牌我没有问题:
$uri = "http://myserver/fmetoken/view"
$postParams = @{user='Myuser';password='PS78U-w&';}
$foo = Invoke-WebRequest -Uri $uri -Method Post -Body $postParams
$foo.Content
我收到令牌。
如果我用postman验证,没有问题。
但如果我想在 C# 中实现相同的操作,响应是: 'The remote server returned an error: (401) Unauthorized.' 当密码包含 '&' 和 '=' 等字符时
var url = $"{fmeServerUrl}/fmetoken/view";
var body = $"user={settingsUserFme}&password={settingsPasswordFme}";
var byteArray = Encoding.UTF8.GetBytes(body);
var responseCode = 0;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Credentials = CredentialCache.DefaultCredentials;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream()))
{
responseresult = reader.ReadToEnd();
reader.Close();
}
我已经尝试使用:
var bodyencoded = System.Net.WebUtility.UrlEncode(body);
var byteArray = Encoding.UTF8.GetBytes(bodyencoded);
但在这种情况下,我收到了一个错误的请求
如果您对整个 body
进行 UrlEncode,正文中旨在帮助解析的 & 和 = 字符将被丢弃,因此您的请求将变成如下内容:
user=Myuser&password=PS78U-w&
user=Myuser%26password=PS78U-w%26 // post UrlEncode
所以服务器假设您发送的是一个非常长的用户名,而不是两个不同的参数。
为避免这种情况,您可以单独对密码参数进行 UrlEncode,然后将其放入您的 body
变量中。
var passencoded = System.Net.WebUtility.UrlEncode(pass)
var body = $"user={settingsUserFme}&password={passencoded}";
结果应该是:user=Myuser&password=PS78U-w%26
,注意 password
之前的 & 符号是重要的并被保留。