【问题标题】:How to wrap the body of a POST request in order to be able to send restricted characters如何包装 POST 请求的正文以便能够发送受限字符
【发布时间】:2018-11-09 08:51:15
【问题描述】:

使用 powershell 从外部服务获取用户的当前令牌我没有问题:

$uri = "http://myserver/fmetoken/view"
$postParams = @{user='Myuser';password='PS78U-w&';}
$foo = Invoke-WebRequest -Uri $uri -Method Post -Body $postParams

$foo.Content

我收到了令牌。

如果我使用邮递员来验证,没有问题。

但如果我想在 c# 中实现相同的操作,响应是: '远程服务器返回错误:(401)未经授权。'当密码中包含 '&' 和 '=' 等字符时

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);

但在这种情况下,我收到了一个错误的请求

【问题讨论】:

标签: c# webrequest httpwebresponse


【解决方案1】:

如果您对整个 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 之前的 & 符号很重要并保留。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2015-12-22
    • 2019-05-16
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多