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

时间:2014-08-25 17:05:32

标签: ios objective-c url afnetworking

我有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);
}];

4 个答案:

答案 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)