1

我刚从 ASIHTTPRequest 切换到 AFNetworking。

我的应用程序允许用户输入搜索词,然后我对我的服务器 (rails) 进行 api 调用以检索要在手机上显示的相关对象列表。很简单。

太长了,看不懂

使用 ASI 库,发送到服务器的搜索词将类似于st%20helena. 现在,使用 AFNetworking,我发送到服务器的搜索词是st%2520helena. 奇怪的是,这实际上有所作为。使用%20,我没有收到任何结果。使用%2520,我收到了我期望的结果。

我的问题是,为什么这会有所作为?我知道这%2520是一个编码的 '%' + 20,它等于一个空格字符,在我看来应该与 pass 相同%20

细节

之前,我只是在第一次编码后将搜索词附加到 URL:

NSString *encoded = [@"st helena" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *url = [NSString stringWithFormat:@"http://www.example.com/?=%@, encoded];

parameters现在,使用AFNetworking ,我将 NSDictionary 传递给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,它等于一个空格字符,在我看来应该与 pass 相同%20

不,它们不相同。解析代码不应该只是一遍又一遍地解码,直到没有更多的百分号。如果是这种情况,就不可能传输实际的百分比字符。它应该只解码一次。这意味着,如果%2520通过线路,它会被解码为数据%20并在那里停止处理。如果%20通过电线,它会被解码一次进入一个空间。解码应该只发生一次。如果您的 Web 服务被%2520视为一个空间,那么它就有一个双重解码错误。

于 2012-08-22T17:34:59.760 回答