POST请求参数值的编码

时间:2014-11-03 13:42:41

标签: c# post encoding httpclient

我正在尝试将POST请求(在某些网址上搜索某些内容)发送到特定网址,在c#中使用HttpClient,并且编码存在问题:使用“test”(代码下方)值工作正常,它给出了我搜索结果,并用另一个字母(“тест”)中的单词,它不给我结果。

顺便说一下,网站搜索工作正常。在第一种情况下,Firefox(Inspect Element - > Network - > POST request - > Parameters)显示如下参数:search:test,在第二种情况下显示:search:òåñò。我试图发送“òåñò”而不是“тест”但没有成功。我做错了什么?请帮忙。

try
{
    using (var httpClient = new HttpClient())
    {
        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url);

        httpRequestMessage.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36");
        httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml");

        List<KeyValuePair<string, string>> parameters = new List<KeyValuePair<string, string>>();
        KeyValuePair<string, string> param = new KeyValuePair<string, string>("search", "test");

        parameters.Add(param);

        HttpContent httpContent = new FormUrlEncodedContent(parameters);
        httpRequestMessage.Content = httpContent;

        var response = await httpClient.SendAsync(httpRequestMessage).ConfigureAwait(false);

        var responseBody = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);

        string respBodyEncoded = encoding.GetString(responseBody);

    }
}
catch
{
}

1 个答案:

答案 0 :(得分:0)

我的猜测是你不是用其他语言编码的URL。对于简单的US-ASCII字符,例如'test',URL编码不是必需的,但“тест”不在US-ASCII范围内,因此应该进行URL编码。

因此,在您的情况下,“тест”参数应为%D1%82%D0%B5%D1%81%D1%82

以下是针对网址的relvant RFC: https://www.ietf.org/rfc/rfc1738.txt

  

如果八位字节没有相应的图形,则必须对其进行编码      US-ASCII编码字符集中的字符,如果使用的话      相应的字符是不安全的,或者是相应的字符      保留用于特定URL中的其他解释      方案