对 URL 的字符串参数进行编码

2023-11-30

我创建了一个为我构建 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]);`

返回值为当它应该是.

我需要对键和值进行编码。我搜索了一些东西并发现CFURLCreateStringByAddingPercentEscapes and stringByAddingPercentEscapesUsingEncoding但我所做的测试都不起作用。

我该怎么做?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 URL 的字符串参数进行编码 的相关文章

随机推荐