1

ASIHTTPRequestからAFNetworkingに切り替えました。

私のアプリでは、ユーザーが検索語を入力できるようにしてから、サーバー(rails)にAPI呼び出しを行って、電話に表示する関連オブジェクトのリストを取得します。十分に単純です。

長すぎる、読まない

ASIライブラリを使用すると、サーバーに送信される検索語はのようになりますst%20helena。これで、AFNetworkingを使用すると、サーバーに送信される検索語はですst%2520helena。奇妙なことに、これは実際に違いを生んでいます。で%20、結果が得られません。で%2520、期待していた結果が得られます。

私の質問は、なぜこれが違いを生むのかということです。%2520これはエンコードされた'%' + 20であり、空白文字に等しいことを知っています。これは、私の考えでは、を渡すことと同じである必要があります%20

詳細

以前は、最初にURLをエンコードした後、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」に変換されている理由です。

4

1 に答える 1

2

私の質問は、なぜこれが違いを生むのかということです。%2520これはエンコードされた'%' + 20であり、空白文字に等しいことを知っています。これは、私の考えでは、を渡すことと同じである必要があります%20

いいえ、それらは同一ではありません。構文解析コードは、パーセント記号がなくなるまで、何度も何度もデコードを続けることは想定されていません。その場合、実際のパーセント文字を送信することは不可能です。一度だけデコードすることになっています。これは、%2520ネットワークを経由する場合、データにデコードされ、%20そこで処理が停止することを意味します。ワイヤーを通過する場合%20、それはスペースに一度デコードされます。デコードは1回だけ行われることになっています。Webサービスが%2520スペースとして扱われている場合は、二重デコードのバグがあります。

于 2012-08-22T17:34:59.760 に答える