2012-08-02 64 views
2

我使用NSString stringWithFormat方法創建URL字符串。但是現在我遇到了「快速」編輯這個字符串的問題。使用帶有NSString的url字符串的最佳實踐stringWithFormat

例如我在服務器上有一個腳本處理一些帶參數的請求。

我有一個URL字符串是這樣的:

http://www.domain.com/api/?param1=%@&param2=%@&param3=%@&param4=%@&param5=%@& 

但是當我有超過5個,6個參數實在是很難修改此字符串。

任何人都知道如何創建URL字符串(我的意思是當我們修改它)最好的方法。

回答

4

我寫了這個專門爲你,很簡單:

+ (NSString*) URlStringForBaseURL:(NSString*)baseURL withParams:(NSDictionary*)paramsdictonary{ 
NSString* url = [baseURL stringByAppendingString:@"?"]; 
NSUInteger index = 0; 
for (NSString* key in [paramsdictonary allKeys]) { 
    index++; 
    if (index == [paramsdictonary count]) 
     url = [url stringByAppendingFormat:@"%@=%@",key,[paramsdictonary valueForKey:key]]; 
    else 
     url = [url stringByAppendingFormat:@"%@=%@&",key,[paramsdictonary valueForKey:key]]; 
} 
return url; 
} 

而且你可以用它(當然,該網址參數的順序是DOS沒關係):

NSMutableDictionary* params = [NSMutableDictionary dictionary]; 
[params setValue:@"value1" forKey:@"param1"]; 
[params setValue:@"value2" forKey:@"param2"]; 
[params setValue:@"value3" forKey:@"param3"]; 

NSString* urlStr = [HTMLTextFormat URlStringForBaseURL:@"http://www.domain.com/api/" withParams:params]; 

NSLog(@"url_: %@",urlStr); 
6

這是如何以安全方式添加參數的示例。長而可靠。

NSString* const kBaseURL = @"http://maps.google.com/maps/api/geocode/xml"; 
NSMutableDictionary *parameterDic = [NSMutableDictionary dictionary]; 
[parameterDic setObject:@"plaza de la puerta del sol 1, madrid, spain" forKey:@"address"]; 
[parameterDic setObject:@"false" forKey:@"sensor"]; 

NSMutableArray *parameters = [NSMutableArray array]; 
for (__strong NSString *name in parameterDic) { 
    NSString *value = [parameterDic objectForKey:name]; 
    name = encodeToPercentEscapeString(name); 
    value = encodeToPercentEscapeString(value); 
    NSString *queryComponent = [NSString stringWithFormat:@"%@=%@", name, value]; 
    [parameters addObject:queryComponent]; 
} 
NSString *query = [parameters componentsJoinedByString:@"&"]; 
NSString *urlString = [NSString stringWithFormat:@"%@?%@", kBaseURL, query]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSLog(@"%@",url); 

上面的代碼調用此C函數,因爲stringByAddingPercentEscapesUsingEncoding不會轉換名稱或參數的值,一些特殊的字符。正如Jesse Rusak指出的,參見Proper URL (Percent) Encoding in iOS進行討論。

// remove CFBridgingRelease and __bridge if your code is not ARC 
NSString* encodeToPercentEscapeString(NSString *string) { 
    return (NSString *) 
     CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, 
              (__bridge CFStringRef) string, 
              NULL, 
              (CFStringRef) @"!*'();:@&=+$,/?%#[]", 
              kCFStringEncodingUTF8)); 
} 

這將打印

http://maps.google.com/maps/api/geocode/xml?sensor=false&address=plaza%20de%20la%20puerta%20del%20sol%201,%20madrid,%20spain 

BONUS TRACK:如何解構和重建的字符串:

NSString *stringUrl = @"http://www.google.com:80/a/b/c;params?m=n&o=p#fragment"; 
NSURL *url = [NSURL URLWithString:stringUrl]; 
NSLog(@"%@",stringUrl); 
NSLog(@"   scheme: %@",[url scheme]); 
NSLog(@"   host: %@",[url host]); 
NSLog(@"   port: %@",[url port]); 
NSLog(@"   path: %@",[url path]); 
NSLog(@" relativePath: %@",[url relativePath]); 
NSLog(@"parameterString: %@",[url parameterString]); 
NSLog(@"   query: %@",[url query]); 
NSLog(@"  fragment: %@",[url fragment]); 

NSMutableString *s = [NSMutableString string]; 
[s appendFormat:@"%@://%@",[url scheme],[url host]]; 
if ([url port]!=nil){ 
    [s appendFormat:@":%@",[url port]]; 
} 
[s appendFormat:@"%@",[url path]]; 
if ([url parameterString]!=nil){ 
    [s appendFormat:@";%@",[url parameterString]]; 
} 
if ([url query]!=nil){ 
    [s appendFormat:@"?%@",[url query]]; 
} 
if ([url fragment]!=nil){ 
    [s appendFormat:@"#%@",[url fragment]]; 
} 
NSLog(@"%@",s); 

這將打印

http://www.google.com:80/a/b/c;params?m=n&o=p#fragment 
     scheme: http 
      host: www.google.com 
      port: 80 
      path: /a/b/c 
    relativePath: /a/b/c 
parameterString: params 
      query: m=n&o=p 
     fragment: fragment 
+1

爾加,不! 'stringByAddingPercentEscapesUsingEncoding:'不是用於此的正確方法。它不會在您的鍵或值中轉義諸如「&」或「=」之類的內容。你需要使用CFURLCreateStringByAddingPercentEscapes和適當的參數或類似的東西。 – 2012-08-02 22:26:22

+0

例如,請參閱http://cybersam.com/ios-dev/proper-url-percent-encoding-in-ios – 2012-08-02 22:28:52

+0

非常好的答案+1 – ant 2012-08-02 22:28:57