【问题标题】:Encode JSON data for URL为 URL 编码 JSON 数据
【发布时间】:2013-09-09 07:38:42
【问题描述】:

在 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;


    }

}

输出:~

网址 = 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/

【问题讨论】:

    标签: ios json nsurl


    【解决方案1】:

    你可以简单地使用

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

    【讨论】:

    • 我试过了,但它抛出了一个错误,说“错误的 URL”堆栈跟踪与我得到的相同:错误错误域 = NSURLErrorDomain 代码 = -1000“错误 URL”用户信息 = 0x1fd89c80 {NSUnderlyingError = 0x21083210 “错误的 URL”,NSLocalizedDescription=错误的 URL}
    • 如何将 param={"abc":"abc","limit":2} 转换为 param=%7B%22abc%22:%22abc%22,%22limit%22:2% 7D
    • 使用“stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding”
    • 但我希望冒号为 %3A,逗号(;)为 %2C
    【解决方案2】:

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

    【讨论】:

    • 我同意你的看法。但是我正在访问已经开发的 API,他们正在其他地方使用它。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        相关资源
        最近更新 更多