2

メソッドを使用NSString stringWithFormatして URL 文字列を作成します。しかし、今、この文字列を「すばやく」編集することに問題があります。

たとえば、サーバー上に、パラメーターを使用してリクエストを処理するスクリプトがあります。

次のような URL 文字列があります。

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

しかし、5 つ、6 つ以上のパラメーターがある場合、この文字列を変更するのは非常に困難です。

URL文字列を作成する最良の方法は誰でも知っています(つまり、変更するときです)。

4

2 に答える 2

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);

上記のコードは、stringByAddingPercentEscapesUsingEncodingがパラメーターの名前または値の一部の特殊文字を変換しないため、このC関数を呼び出します。Jesse Rusakが指摘しているように、議論についてはiOSでの適切なURL(パーセント)エンコードを参照してください。

// 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

ボーナストラック:文字列を分解して再構築する方法:

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
于 2012-08-02T22:15:50.330 に答える
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;
}

そして、あなたはそれを使うことができます (もちろん、URL パラメータの順序は重要ではありません):

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);
于 2012-08-02T22:48:42.693 に答える