iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?

Posted

技术标签:

【中文标题】iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?【英文标题】:iOS how to deal with spaces or special characters passed to AFHTTPSessionManager GET method? 【发布时间】:2014-08-25 17:05:31 【问题描述】:

我有一个 AFHTTPSessionManager 实例负责发出 GET 请求。请求中的参数之一 - 名称中可以包含空格或可能在 URL 中可能不可接受的其他字符。

我看到AFHTTPSessionManager 不会自动用适当的 %symbol 替换空格,所以下面的请求会失败。 如何处理我的字符串以将其转换为与 URL 兼容的字符串? test user to test%20user

我可以通过替换出现的字符串来做字符串,但我正在寻找一种更通用的方法来处理所有非 url 安全字符。

NSURL* baseURL = [NSURL URLWithString:[APP_DELEGATE hostString]];

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];

//is there a way for me
NSString* path = @"user/?name=test user"

[manager GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) 
    DLog(@"Success: %@",responseObject);
 failure:^(NSURLSessionDataTask *task, NSError *error) 
    DLog(@"Failure:  %@",error);
];

【问题讨论】:

【参考方案1】:

我认为你正在寻找的方法是

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

即:

NSString* path = [@"user/?name=test user" stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

在您的情况下,您可能只需将百分比编码应用于可能包含无效字符的实际值(即“测试用户”)

另一种选择是使用 AFNetworking 的 get 方法提供的 NSDictionary。 使用此选项,您可以使用键/值对 "name":"test user" 创建一个 nsdictionary 然后将其传递给 AF 的 get 方法。 AF 会将其作为查询字符串添加到您的获取路径中。

NSString* path = @"user";
NSDictionary* params = [NSDictionary dictionaryWithObject:@"test user" forKey:@"name"];
[manager GET:path parameters:params success...

【讨论】:

使用 AFNetworking 的 params 字典是一个非常好的解决方案【参考方案2】:

我发现以下方法对于适当地编码 URL 特别有用:

- (NSString *)urlEncode:(NSString *)str 
    return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)str, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8));

【讨论】:

谢谢迈克摇滚!!【参考方案3】:

您可以使用AFHTTPRequestSerializer

【讨论】:

这是我最初拥有的,但它给出了这个错误:***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效参数不满足:URLString' 更多细节会很好【参考方案4】:

您可以将 url 的查询部分放入字典中,并将其作为 parameters 传递。 AFNetworking 将为您处理。正如@aaron 所说。

如果您想自己实现 util 函数,请注意 stringByAddingPercentEscapesUsingEncoding 已弃用。您可以查看 AFNetworking 如何实现它。方法如下:

NSString * AFPercentEscapedStringFromString(NSString *string)

【讨论】:

以上是关于iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理非规范化数据以传递给平面列表?

ThreadPool 如何处理传递的变量

如何处理 Parse.com 将 HTTP 错误转换为 NSError?

我应该如何处理 iOS 中的 ASIHTTPRequest 异步调用?

如何处理插入 '\0' 的字符数组?

如何处理枚举中空值的 InvalidFormatException