2009-08-09 68 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://other.com&apiKey=ABCDEF当它应该是http://api.example.com/articles?version=2.0.1&url=http%3A%2F%2Fother.com&apiKey=ABCDEF

我需要对密钥和值进行编码。我搜索了一些东西,发现CFURLCreateStringByAddingPercentEscapesstringByAddingPercentEscapesUsingEncoding但我没有做任何测试工作。

我该怎么办?

+0

对不起!我的代码打破了语法高亮,我无法修复它!任何人? – 2009-08-09 00:07:23

回答

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的第4个参数的值。

+0

不错!现在正在工作! – 2009-08-09 01:24:09

+0

一个问题:第四个参数可以接受任何需要编码的字符? – 2009-08-09 01:34:37

+0

是的。从文档: legalURLCharactersToBeEscaped 要转义的合法字符。传递NULL以指定不替换合法字符。 只有几个字符否则不会被转义,但我走了安全路线,因为我懒得去查看那些是哪些(尽管它可能是一个好主意)。 – Wevah 2009-08-09 07:57:44

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]; 
} 
相关问题