1

在 iOS 中,我想在 URL 中发送 JSON 数据以进行服务调用。我尝试截断以下代码,但编码 URL 似乎错误。因为在 JSON 中,key 和 value 之间有一个冒号字符 (:) 和逗号字符 (,) 用于分隔。但是,我无法将冒号(:) 编码为%3A并将逗号(,) 编码为%2C

代码片段:

- (NSURL *)getEncodedUrl {

    // Build dictionnary with parameters
    NSString *abc = @"abc";
    NSNumber *limitNumber = [NSNumber numberWithInt:2];
    NSMutableDictionary *dictionnary = [NSMutableDictionary dictionary];
    [dictionnary setObject:limitNumber forKey:@"limit"];
    [dictionnary setObject:abc forKey:@"abc"];

    NSError *error;
    NSData *jsonData =  [NSJSONSerialization dataWithJSONObject:dictionnary options:0 error:&error];

    if (!jsonData) {
        debug("Json error %@",error);
        return nil;
    } else {

        NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];
        debug("Json op %@",JSONString);

        NSString* params = [JSONString stringByAddingPercentEscapesUsingEncoding:
                            NSASCIIStringEncoding];

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://baseUrl.com?param=@",params]];
        debug("URL = %@",url);

        return url;


    }

}

输出:~

URL = http://baseUrl.com?param=%7B%22abc%22:%22abc%22,%22limit%22:2%7D

(包括冒号和逗号字符)

但我想关注o/p:

http://baseUrl.com?param=%7B%22abc%22%3A%22abc%22%2C%22limit%22%3A2%7D

(没有冒号和逗号字符)

我现在所指的在线编码-解码站点。

http://www.url-encode-decode.com/

4

4 回答 4

0

你可以简单地使用

 NSString *url = @"http://baseUrl.com?param=%7B%22abc%22:%22abc%22,%22limit%22:2%7D";

   NSString *encodeImgUrl = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
于 2013-09-05T12:57:12.777 回答
0

因此,您尝试在此处生成 URL 的查询部分。冒号是包含在 URL 查询中的完全合法的字符。我写了一篇文章,介绍了在 Cocoa 中转义 URL 查询的复杂性:

http://www.mikeabdullah.net/escaping-url-queries-in-cocoa.html

由于您热衷于执行额外的转义,我建议使用我的示例代码并将其扩展为特别要求:;要转义的字符。

于 2013-09-06T14:43:34.443 回答
0

我建议您将 JSON 作为 POST 数据而不是您正在使用的 GET 数据发送。将其打包为 MIME 数据会更直接,并且您所做的任何编码都会更容易理解。

于 2013-09-05T14:27:30.950 回答
0

我在 API 调用中犯了一个小错误,这就是我得到错误结果的原因。无需将冒号 (:) 编码为 %3A 并将逗号 (,) 编码为 %2C。

还有一件事我想和你分享。您可以使用 base64 字符串而不是编码 JSON 部分。

于 2013-09-19T14:36:14.223 回答