2012-08-22 109 views
1

我剛從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」。

回答

2

我的問題是,爲什麼這有所作爲?我知道%2520是一個編碼的'%'+ 20,它等於一個空白字符,在我看來它應該與傳遞%20相同。

不,它們不相同。解析代碼不應該一直保持解碼,直到沒有剩下百分號。如果是這樣的話,就不可能傳輸實際的百分比字符。它只能解碼一次。這意味着如果%2520通過導線,它將被解碼爲數據%20並且處理在那裏停止。如果%20越過導線,它將被解碼一次到一個空間。解碼只能發生一次。如果您的網絡服務將%2520視爲空間,那麼它具有雙重解碼錯誤。

+0

實際上,'%25%20'的單個解碼過程給出'%',而'%25%20'上的雙重解碼過程有未指定的結果。另一方面,'%2520'的單個解碼過程給出了'%20',而'%2520'上的雙重解碼過程完全有效且給出了空間。 –

+0

謝謝,那是一個錯字。我的意思是'%2520'就像問題一樣。後面的雙重解碼過程在它有一個定義的結果的意義上是有效的,但是在你不應該首先進行雙重解碼的意義上是不正確的。 – Jim

+0

我最終得出了同樣的結論,並且正在寫一個關於這個問題如何混淆YQL和Sphinx的答案,但是你的答案更一般,並且可能對未來的讀者更有用。謝謝! – djibouti33