一:之前开发中,跟后台交互请求数据都放在body里面,直接将字典丢到AFNetworking的parameters参数里面就OK了。但是后面后台交互请求数据都放在header里面了,现在前端直接将参数放在parameters里面将会出现各种问题。需要将字典拼接成URL?key=value&key=value形式。此时,如果直接拼接使用的话,如果里面包含中文,则也会出错。
二:那么就需要对URL进行转译。之前的方法是
NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
但是现在这个方法被弃用了,需要换成
NSString *encodedString = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
三:但是如果包含特殊字符的话,特殊字符会被转换成%234这样的字符串,又出问题了。此时又需要换一个方法。
- (NSString *)urlQueryStringWithDic:(NSDictionary *)dic {
NSMutableString *string = [NSMutableString string];
for (NSString *key in [dic allKeys]) {
if ([string length]) {
[string appendString:@"&"];
}
CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)[[dic objectForKey:key] description], NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);
[string appendFormat:@"%@=%@", key, escaped];
CFRelease(escaped);
}
return string;
}
最后,吐槽一下,请求数据为啥不能老老实实的放在body里面。
网友评论