2009-08-09 13 views
1

私のためにURLを構築する方法を作成しました。URLのエンコーディング文字列の引数

- (NSString *)urlFor:(NSString *)path arguments:(NSDictionary *)args 
{ 
    NSString *format = @"http://api.example.com/%@?version=2.0.1"; 
    NSMutableString *url = [NSMutableString stringWithFormat:format, path]; 

    if ([args isKindOfClass:[NSDictionary class]]) { 
     for (NSString *key in args) { 
      [url appendString:[NSString stringWithFormat:@"&%@=%@", key, [args objectForKey:key]]]; 
     } 
    } 

    return url; 
} 

私が以下のようなものを構築しようとすると、もちろんURLはエンコードされません。

NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"http://other.com", @"url", 
          @"ABCDEF", @"apiKey", nil]; 

NSLog(@"%@", [self urlFor:@"articles" arguments:args]);` 

返される値は、それがhttp://api.example.com/articles?version=2.0.1&url=http%3A%2F%2Fother.com&apiKey=ABCDEFあるべきときhttp://api.example.com/articles?version=2.0.1&url=http://other.com&apiKey=ABCDEFです。

キーと値の両方をエンコードする必要があります。何かを検索したところ、CFURLCreateStringByAddingPercentEscapesstringByAddingPercentEscapesUsingEncodingが見つかりましたが、私が作ったテストはありませんでした。

私はそれをどのように行うことができますか?

+0

申し訳ありません。私のコードは構文の強調表示を壊してしまい、修正できません!誰でも? –

答えて

3

IIRCの場合、スラッシュはURLのクエリ部分にあるときに正しく解釈される必要があります。エンコードされたスラッシュなしでまだ動作しているかどうかテストしましたか?

if ([args isKindOfClass:[NSDictionary class]]) { 
     for (NSString *key in [args allKeys]) { 
      NSString *value = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)[args objectForKey:key], NULL, CFSTR("/?&:=#"), kCFStringEncodingUTF8) autorelease]; 
      [url appendString:[NSString stringWithFormat:@"&%@=%@", key, value]]; 
      [value release]; 
     } 
} 

return url; 

注CFURLCreateStringByAddingPercentEscapesに第四引数の値:それ以外の場合は、のような何かをします。

+0

ニース!今働いている! –

+0

1つの質問:第4引数は、符号化する必要のある文字をすべて受け入れることができますか? –

+0

はい。ドキュメントから: legalURLCharactersToBeEscaped エスケープする法的文字。有効な文字が置換されないことを指定するには、NULLを渡します。 エスケープされていない文字がいくつかありますが、私は安全ルートに入っています。私はあまりにも怠けていたので、そのルートを調べました。 – Wevah

1

Google Toolbox for Mac's GTMNSString+URLArgumentsを使用することを検討する必要があります。この目的のために設計されています。

+0

GTMを確認します。どうやら、このライブラリは、それに関するすべての質問に言及しているので、良いものです。 –

0

私はKSFileUtilitiesクラスのクラスをお勧めします。例は次のようになります:

- (NSString *)urlFor:(NSString *)path arguments:(NSDictionary *)args 
{ 
    NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:args]; 
    [parameters setObject:@"2.0.1" forKey:@"version"]; 

    NSURL *result = [NSURL ks_URLWithScheme:@"http" 
             host:@"api.example.com" 
             path:path 
          queryParameters:parameters; 

    return [result absoluteString]; 
} 
関連する問題