我有AFHTTPSessionManager
的实例负责发出GET请求。请求中的一个参数 - 名称中可以包含空格,也可能包含URL中可能不可接受的其他字符。
我发现AFHTTPSessionManager
不会自动用适当的%符号替换空格,因此下面的请求将失败。 如何处理字符串以将其转换为与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);
}];
答案 0 :(得分:6)
我认为您正在寻找的方法是
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
那是:
NSString* path = [@"user/?name=test user" stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
在您的情况下,您可能只需将百分比编码应用于可能包含无效字符的实际值(即"测试用户")
另一种选择是使用AFNetworking的get方法提供的NSDictionary。 使用此选项,您可以使用键/值对创建一个nsdictionary {" name":" test user"} 然后在AF的get方法中传递它。 AF会将此作为查询字符串添加到您的获取路径中。
NSString* path = @"user";
NSDictionary* params = [NSDictionary dictionaryWithObject:@"test user" forKey:@"name"];
[manager GET:path parameters:params success...
答案 1 :(得分:2)
我发现以下方法对于正确编码网址非常有用:
- (NSString *)urlEncode:(NSString *)str {
return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)str, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8));
}
答案 2 :(得分:0)
您可以使用AFHTTPRequestSerializer
。
答案 3 :(得分:0)
您可以将url的查询部分放入字典中,并将其作为parameters
传递。 AFNetworking将为您处理。正如@aaron所说。
如果您想自己实现util函数,请注意stringByAddingPercentEscapesUsingEncoding
已过时。您可以检查AFNetworking如何实施它。通过以下方法:
NSString * AFPercentEscapedStringFromString(NSString *string)