2017-02-06 38 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