【问题标题】:AFNetworking, sending an NSDictionary inside an NSDictionaryAFNetworking,在 NSDictionary 中发送 NSDictionary
【发布时间】:2013-09-26 00:47:35
【问题描述】:

我正在尝试使用 AFNetworking 将嵌套字典发送到我的服务器。

字典遵循这个非常简单的模式:

NSMutableDictionary *dico1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                             @"value1", @"key1",
                             @"value2", @"key2",
                             @"value3", @"key3",
                             @"value4", @"key4",
                             nil];

NSMutableDictionary *dico2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                             @"value1", @"key1",
                             dico1,     @"key2",
                             @"value3", @"key3",
                             @"value4", @"key4",
                             nil];


当我使用“好老夫妻”NSJSONSerialization/NSURLConnection 将 dico2 发送到我的服务器时,服务器会收到我所期望的,意思是(这里是日志跟踪):

parameters =
 { key2: { key2: 'value2', key3: 'value3', key1: 'value1', key4: 'value4' },
   key3: 'value3',
   key1: 'value1',
   key4: 'value4' }

我的服务器是用 javascript 编写的,并检查 parameters.key2 的存在。在这种情况下,parameters.key2 被定义,因此服务器可以毫无问题地使用它。这是我一直这样做的方式,而且效果很好...

但现在,我正尝试使用 AFJSONRequestOperation(使用 [httpClient setParameterEncoding:AFJSONParameterEncoding])发送完全相同的 dico2,我收到以下信息:

parameters =
{ key1: 'value1',
  'key2[key1]': 'value1',
  'key2[key2]': 'value2',
  'key2[key3]': 'value3',
  'key2[key4]': 'value4',
  key3: 'value3',
  key4: 'value4' }

我的服务器发送一个错误消息,指出 parameters.key2 未定义!

似乎 JSON 数据在 NSJSONSerialization/NSURLConnection 和 AFJSONRequestOperation 之间的编码方式不同。

我如何才能使用 AFJSONRequestOperation 获得与以前相同的编码?
是有人可以帮忙吗?

谢谢!


为马特编辑:

这是我使用 AFHTTPClient 的方式:我将 httpClient 分解为我在代码中随处使用的常用方法:

-(NSMutableURLRequest*)formatAFJSONRequest:(NSString*)type command:(NSString*)command parameters:(NSMutableDictionary*)parameters {


NSURL *api_url = [NSURL URLWithString:[NSString stringWithFormat:ADDRESS, API_KEY]];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:api_url];
[httpClient setParameterEncoding:AFJSONParameterEncoding];

NSMutableURLRequest *JSONRequest = [httpClient requestWithMethod:@"GET"
                                                            path:[NSString stringWithFormat:@"%@/%@", type, command]
                                                      parameters:parameters];

JSONRequest.cachePolicy     = CACHE_POLICY_SERVER_REQUEST;
JSONRequest.timeoutInterval = TIMEOUT_SERVER_REQUEST;   

if (DEBUG_1) { NSLog(@"[%@/%@] sent to server (AFN): %@", type, command, parameters); }

return JSONRequest;
}

非常感谢您的帮助!

赛博

【问题讨论】:

  • 你得到这个是因为你正在访问递归字典的值。如果要获取值,请尝试这样:- NSDictionary *dict=[dico2 objectForKey:@"key2"]; NSString *str=[dict objectForKey:@"key2"]; NSLog(@"str=%@",str);
  • @hussainShabbir:感谢您的回答。我理解,但我的问题实际上不是来自“客户端”,而是更多来自服务器端:服务器接收的 JSON 数据与 NSJSONSerialization/NSURLConnection 和 AFJSONRequestOperation 的编码方式不同......
  • 您使用的是最新版本的 AFNetworking 吗? (1.x 还是 2.x?)
  • @AaronBrager:我使用的是 1.3.2 版本?

标签: cocoa-touch afnetworking json


【解决方案1】:

GET 请求没有 HTTP 正文,因此参数被编码为查询字符串。如果您确实需要将请求设为GET,解决方法是先创建一个POST 请求,然后将方法更改为GET

这在AFNetworking's docs for AFHTTPClient -parameterEncoding中有解释:

AFHTTPClientParameterEncoding 值对应于参数如何编码到请求正文中对于 GET、HEAD 或 DELETE 以外的请求方法。这是默认的 AFFormURLParameterEncoding。

警告:某些嵌套参数结构,例如包含不一致键的键控哈希数组(即@{@"": @[@{@"a" : @(1)}, @{@"b" : @(2)}]}),无法在查询字符串中明确表示。强烈建议在发布复杂或不确定的参数结构时使用明确的编码,例如 AFJSONParameterEncoding

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2011-07-21
    • 2023-03-10
    • 2011-08-04
    相关资源
    最近更新 更多