2017-02-06 40 views
2

我试图找出HttpClient如何处理URL的一些不一致之处。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

然而,看着提琴手的要求,我可以看到什么是实际发送的是: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?我能以某种方式解决这个问题吗?

+0

这应该无关紧要时,它应该忽略括号时,忽略它。 –

+0

不确定你的意思@ m.rogalski?问题是我需要使用实际发送的查询字符串来计算签名。所以当我计算签名时,我有%28和%29而不是(和)。发送的内容是(和)未编码的,但只有当我使用字母é时! – Joel

回答

1

所以这原来是Uri如何编码和解码url中有和没有unicode字符的差异:https://github.com/dotnet/corefx/issues/15865

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