我试图弄清楚HttpClient如何处理URL的一些不一致.
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=(caféORboulangerie)
但是,看着fiddler的请求,我可以看到实际发送的是:https://api.twitter.com/1.1/search/tweets.json?q =(caféORboulangerie)
所以突然间,括号不再被编码.这在我的情况下很重要,因为我使用编码的查询字符串来计算我用来对twitter进行身份验证的签名.所以我的签名将包含百分比编码的括号而请求不会,因此Twitter会抛出错误并告诉我验证失败.
有趣的是,如果我使用常规e而不是é发送查询,则括号将在请求中进行编码!像这样:https://api.twitter.com/1.1/search/tweets.json?q =(cafe OR boulangerie)
解决方法
所以这对于Uri如何编码和解码带有和不带有unicode字符的URL是不同的:
https://github.com/dotnet/corefx/issues/15865.
我的解决方案是解析Uri.AbsoluteUri的内容(以相同,不一致的方式对url进行编码),并在计算身份验证的签名时使用它.而不是像我之前使用的那样使用Uri.EscapeDataString.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。