我有一个使用httpclient将数据发布到服务器的问题。它与使用FormUrlEncodedContent的httpClient.PostAsync配合得很好。
但是,如果我的FormUrlEncodedContent内容包含“〜”字符,则不会将其转换为%7E。我不知道如何强制它对它进行编码。
以下是我目前的编码示例。
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
["content"] = "Hello World~"
});
var response = await httpClient.PostAsync(url, content);
身体内容的Fiddler原始结果将是:
含量=你好%20World〜
这不是我的预期。我希望结果应该是 含量=你好%20World%7E
我该怎么做?
由于
答案 0 :(得分:0)
这很有趣。所以代字号(〜)非常特别......如果你看一下rfc2396和rfc3986,它实际上是允许在URL中使用的。 rfc1738将其定义为%7e,但rfc2396和rfc3986有点否定。
所以......这基本上取决于编码实现。例如,PHP在某些时候更改了它:http://php.net/manual/en/function.rawurlencode.php
顺便说一下。在CoreFx仓库中,您可以查看FormUrlEncodedContent
的源代码如您所见,它使用Uri.EscapeDataString
它说明了
默认情况下,EscapeDataString方法转换除了以外的所有字符 对于他们的十六进制的RFC 2396非保留字符 表示。
在RFC 2396中,代字号定义为无保留字符。
所以这根据文档工作,fiddler向你展示的是绝对有效的URL。
根据您的具体问题获取%7e而不是&#39;〜&#39;: 一种选择是手动更换,因为这是一个特殊情况。
另一个是使用System.Web.HttpUtility.UrlEncode,它将其编码为%7e。 EscapeDataString(由FormUrlEncodedContent使用)和System.Web.HttpUtility.UrlEncode之间的区别在于EscapeDataString使用尽可能多的明文字符。但是它们都创建了一个有效的URL编码字符串。
答案 1 :(得分:0)
这是应该做的工作:
var formParams = new Dictionary<string, string>(){
["content"] = "Hello World~"
};
var stringFormParams = new Func<IDictionary<string,string>,string>((dic) => {
string result = "";
foreach(var param in dic) {
if (result.Length > 0) { result += "&"; }
result += param.Key + "=" + WebUtility.UrlEncode(param.Value);
}
return result;
}).Invoke(formParams);
var stringContent = new StringContent(stringFormParams, Encoding.UTF8, "application/x-www-form-urlencoded");
Console.WriteLine(stringContent.ReadAsStringAsync().Result);
HttpClient httpClient = new HttpClient();
var response = await httpClient.PostAsync(url, stringContent);
输出:
content=Hello+World%7E
答案 2 :(得分:0)
所以你想使用HttpUtility UrlEncode方法,可以在&#34; System.Web&#34;中找到。图书馆。有关msdn页面的信息,请参阅here。
System.Web.HttpUtility.UrlEncode(@"~\Hello World");
结果:
%7E%5cUrl%5cHello +世界
我已经尝试并测试了它 - 它正确地用正确编码的对应符号替换符号。
答案 3 :(得分:0)
@gregkalapos和@Bertie有一个很棒的答案。
但是我可以使用Uri进行编码。
Uri.EscapeDataString(str)
如果您需要unescape,请使用Uri.UnescapeDataString(str)
请参阅:How to encode/decode url strings in an UWP App