我剛從ASIHTTPRequest切換到AFNetworking。API調用基於空白編碼返回不同的結果(%2520與%20)
我的應用程序允許用戶輸入搜索詞,然後我對我的服務器(rails)進行api調用,以檢索要在手機上顯示的相關對象列表。夠簡單。
過長,將無法讀取
隨着ASI庫,發送到服務器的搜索詞將像st%20helena
。現在,通過AFNetworking,我發送到服務器的搜索詞是st%2520helena
。奇怪的是,這實際上有所作爲。 %20
,我沒有收到任何結果。用%2520
,我收到了我期待的結果。
我的問題是,爲什麼這有所作爲?我知道%2520
是一個編碼的'%'+ 20,它等於一個空白字符,在我看來它應該與傳遞%20
相同。
詳細
之前,我只是附加的搜索項的URL後首次對其進行編碼:
NSString *encoded = [@"st helena" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *url = [NSString stringWithFormat:@"http://www.example.com/?=%@, encoded];
現在,AFNetworking,我路過一個NSDictionary到parameters
說法的AFHTTPClient#getPath
。
NSString *encoded = [@"st helena" stringByAddingPercentEscapesUsingEncoding:NSUTR8StringEncoding];
NSDictionary *dict = @{ @"q" : encoded };
[[myClient sharedClient] getPath:@"" parameters:dict ...]
由於AFNetworking編碼字典中的項,我的搜索字符串被雙重編碼,這就是爲什麼「%20」的%被轉化爲「%25」。
實際上,'%25%20'的單個解碼過程給出'%',而'%25%20'上的雙重解碼過程有未指定的結果。另一方面,'%2520'的單個解碼過程給出了'%20',而'%2520'上的雙重解碼過程完全有效且給出了空間。 –
謝謝,那是一個錯字。我的意思是'%2520'就像問題一樣。後面的雙重解碼過程在它有一個定義的結果的意義上是有效的,但是在你不應該首先進行雙重解碼的意義上是不正確的。 – Jim
我最終得出了同樣的結論,並且正在寫一個關於這個問題如何混淆YQL和Sphinx的答案,但是你的答案更一般,並且可能對未來的讀者更有用。謝謝! – djibouti33