HttpClient 解码编码Url?
HttpClient decodes encoded Url?
我正在尝试找出 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=%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
的某种错误?我能以某种方式解决这个问题吗?
因此,结果证明 Uri
编码和解码 url 时使用和不使用 unicode 字符的方式有所不同:https://github.com/dotnet/corefx/issues/15865.
我的解决方案是解析 Uri.AbsoluteUri
的内容(它以相同的、不一致的方式对 url 进行编码)并在计算身份验证签名时使用它。而不是像我之前使用的那样使用 Uri.EscapeDataString
。
我正在尝试找出 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=%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
的某种错误?我能以某种方式解决这个问题吗?
因此,结果证明 Uri
编码和解码 url 时使用和不使用 unicode 字符的方式有所不同:https://github.com/dotnet/corefx/issues/15865.
我的解决方案是解析 Uri.AbsoluteUri
的内容(它以相同的、不一致的方式对 url 进行编码)并在计算身份验证签名时使用它。而不是像我之前使用的那样使用 Uri.EscapeDataString
。