The issue is that by default most of these methods leave characters such as & = ? within a URL, as they are strictly speaking valid. The problem is that these characters have special meanings in a GET request, and will more than likely make your request invalid.
也就是說,你提供的 URL 字符串 里面可能包含某些字符,比如‘$‘ ‘&’ ‘?’...等,這些字符在 URL 語法中是具有特殊語法含義的,
比如 URL :http://www.baidu.com/s?wd=%BD%AA%C3%C8%D1%BF&rsv_bp=0&rsv_spt=3&inputT=3512
中 的 & 起到分割作用 等等,如果 你提供的URL 本身就含有 這些字符,就需要把這些字符 轉化為 “%+ASCII” 形式,以免造成沖突。
這就引入:CFURLCreateStringByAddingPercentEscapes 函數。
該函數將 將要添加到URL的字符串進行特殊處理,如果這些字符串含有 &, ? 這些特殊字符,用“%+ASCII” 代替之。
CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)parameter, NULL,
CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8 );
// 確定 parameter 字符串中含有:/?#[]@!$&’()*+,;= 這些字符時候,這些字符需要被轉化,以免與語法沖突,其中空格是默認被轉化的,所以沒有列出來
例如: 建立一個 NSURL 的 category
+ (NSURL *)URLWithBaseString:(NSString *)baseString parameters:(NSDictionary *)parameters{ NSMutableString *urlString =[NSMutableString string]; //The URL starts with the base string[urlString appendString:baseString]; [urlString appendString:baseString]; NSString *escapedString; NSInteger keyIndex = 0; for (id key in parameters) { //First Parameter needs to be prefixed with a ? and any other parameter needs to be prefixed with an & if(keyIndex ==0) {
CFStringRef encodedCFString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)[parameters valueForKey:key],nil,CFSTR("?!@#$^&%*+,:;='/"`<>()[]{}///| "), kCFStringEncodingUTF8);
escapedString = [[NSString alloc] initWithString:(__bridge_transfer NSString*) encodedCFString];
[urlString appendFormat:@"?%@=%@",key,escapedString]; }else{
CFStringRef encodedCFString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)[parameters valueForKey:key],nil,CFSTR("?!@#$^&%*+,:;='/"`<>()[]{}///| "), kCFStringEncodingUTF8);
escapedString = [[NSString alloc] initWithString:(__bridge_transfer NSString*) encodedCFString];
[urlString appendFormat:@"&%@=%@",key,escapedString];
}
keyIndex++;
}
return [NSURL URLWithString:urlString];
}
@end
調用測試:
NSString * baseString = @"http://twitter.com/statuses/update.xml"; NSDictionary*dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"This is my status",@"status",@"meng ya", @"meyers",nil]; NSURL * url = [NSURL URLWithBaseString:baseString parameters:dictionary]; NSLog(@"the url : %@", url);
輸出:
the url : http://twitter.com/statuses/update.xml?status=This%20is%20my%20status&meyers=meng%20ya
新聞熱點
疑難解答