C#Httpclient FormUrlEncodedContent编码

时间:2017-03-17 08:23:05

标签: c# uwp .net-core

我有一个使用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

我该怎么做?

由于

4 个答案:

答案 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