HttpClient解码编码的Url?

时间:2017-02-06 16:05:05

标签: c# encoding .net-core dotnet-httpclient url-encoding

我正在尝试找出HttpClient如何处理网址的一些不一致。

我有以下测试代码:

public async Task TestHttpClient()
{
    var baseUrl = "https://api.twitter.com/1.1/search/tweets.json";
    //var query = "(cafe OR boulangerie)";
    var query = "(café OR boulangerie)";

    var url = baseUrl + $"?q={Uri.EscapeDataString(query)}";

    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(url);

    await response.Content.ReadAsStringAsync();
}

代码实际上不起作用,因为我们需要身份验证和Twitter搜索的其他东西。但它证明了我的问题。

变量url将具有以下值: https://api.twitter.com/1.1/search/tweets.json?q=%28caf%C3%A9%20OR%20boulangerie%29

但是,查看Fiddler中的请求,我可以看到实际发送的内容是:https://api.twitter.com/1.1/search/tweets.json?q=(caf%C3%A9%20OR%20boulangerie)

所以突然间,括号不再被编码。这在我的情况下很重要,因为我使用编码的查询字符串来计算我用来对twitter进行身份验证的签名。所以我的签名将包含百分比编码的括号而请求不会,因此Twitter会抛出错误并告诉我验证失败。

有趣的是,如果我使用常规e而不是é发送查询,则括号将在请求中进行编码!像这样:https://api.twitter.com/1.1/search/tweets.json?q=%28cafe%20OR%20boulangerie%29

我想这是HttpClient的某种错误?我可以以某种方式解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

因此,Uri编码和解码包含和不包含unicode字符的网址的方式不同:https://github.com/dotnet/corefx/issues/15865

我的解决方案是解析Uri.AbsoluteUri(以相同,不一致的方式对url进行编码)的内容,并在计算身份验证的签名时使用它。而不是像以前那样使用Uri.EscapeDataString