Кодирование строковых аргументов для URL - PullRequest
1 голос
/ 09 августа 2009

Я создал метод для создания 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.

Мне нужно закодировать ключ и значение. Я что-то искал и нашел CFURLCreateStringByAddingPercentEscapes и stringByAddingPercentEscapesUsingEncoding , но ни один из выполненных мной тестов не сработал.

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 09 августа 2009

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;

Обратите внимание на значение 4-го аргумента для CFURLCreateStringByAddingPercentEscapes.

1 голос
/ 09 августа 2009

Вам следует рассмотреть возможность использования Google Toolbox для Mac GTMNSString + URLArguments ; он предназначен именно для этой цели.

0 голосов
/ 19 января 2011

Я бы порекомендовал наш 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...