【问题标题】:NSArray of NSDictionaries as a query parameterNSDictionaries 的 NSArray 作为查询参数
【发布时间】:2015-12-17 16:05:10
【问题描述】:

我需要在 NSURLRequest 的 GET 请求中发送一个 NSDictionaries 的 NSArray 作为查询参数。我想发送的一个例子是这样的:

[{"name":"John","age":20},{"name":"Bob","age":25}]

我是通过 AFNetworking 发送的,内容如下:

- (NSString *)makeJSONString {
    NSMutableArray *mutableArray = [NSMutableArray array];
    for (RDPerson *person in [self.people allValues]) {
    NSDictionary *currentPerson = @{@"name" : person.name, @"age" : person.age};
    [mutableArray addObject:currentPerson];
    }
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:mutableArray options:0 error:&error];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return jsonString;
}

现在我已经将我的代码移到了 NSURLSession,这不起作用,那么将这个对象放入查询参数的正确方法是什么?

不工作的部分是

[self.urlSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

此完成处理程序为数据和响应返回 null

解决方案: 所以事实证明,在您将其提交到 URL 之前,您必须为您的 url 执行此操作:

[mutableString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

然后使用 URLWithString 将其设置为 URL

【问题讨论】:

  • 有什么不好的?请添加更多详细信息。
  • 请发布不起作用的代码,以便我们查看可能是什么问题。此外,一般情况下,您不希望将 JSON 转换为字符串,而是将其保留为 NSData
  • 正确的方法是根据您的请求使用实体(“body”),大型 json 几乎不是参数。如果您希望进行最少的更改,请检查您的完整 URL 是否有效且完整,可能需要使用这种方法对某些参数进行编码和解码。\
  • 继续 A-Live 的观察,将 JSON 放入请求的正文中,请求应该是 POST 请求,而不是 GET 请求。 GET 请求没有正文,而 POST 请求有。如果你想成为一个好的网民,你应该在准备这个POST请求时将Content-Type HTTP header设置为application/json
  • 这些是我放在基本 URL 之后的参数

标签: ios objective-c nsurlsession nsurlrequest


【解决方案1】:

警告:您提出的解决方案正确,可能会导致安全漏洞,更不用说它可能会以不可预知的方式随机失败,原因有两个:

  1. stringByAddingPercentEscapesUsingEncoding 几乎总是错误的调用方法。它已被弃用,因为它不能正常工作。

    如果您需要支持 iOS 9 之前的任何 iOS 版本,请使用CFURLCreateStringByAddingPercentEscapes

  2. 您应该一次对整个 URL 进行编码。您应该始终对要添加到 URL 的任意数据的实际 blob 进行编码,例如

    NSString *JSONBlob = ...
    NSString *encodedJSONBlob = (__bridge_transfer NSString *)
        CFURLCreateStringByAddingPercentEscapes(
            kCFAllocatorDefault,
            (__bridge NSString *)JSONBlob,
            NULL,
            CFSTR(":/?#[]@!$&'()*+,;="),
            kCFStringEncodingUTF8);
    
    NSString *URL = [NSString stringWithFormat:@"http://example.com/.../foo.cgi?myparam=%@&foo=bar", encodedJSONBlob];
    

    否则,编码方法可能会对已编码的部分 URL 进行双重编码。

详情见:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/WorkingwithURLEncoding/WorkingwithURLEncoding.html

正如其他人所提到的,如果您的 JSON 数据很大,您应该改为在 POST 正文中发送它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多