Cocoa touch AFNetworking,在NSDictionary中发送NSDictionary

Cocoa touch AFNetworking,在NSDictionary中发送NSDictionary,cocoa-touch,afnetworking,json,Cocoa Touch,Afnetworking,Json,我正在尝试使用AFNetworking将嵌套字典发送到我的服务器。 字典遵循这样一个非常简单的模式: NSMutableDictionary *dico1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2",

我正在尝试使用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];

当我使用“the good old Course”NSJSONSerialization/NSURLConnection将dico2发送到我的服务器时,服务器会收到我期望的结果,这意味着(这里是日志跟踪):

我的服务器是用javascript编写的,并检查parameters.key2是否存在。在本例中,定义了parameters.key2,所以服务器可以毫无问题地使用它。我一直都是这样做的,而且效果很好……

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

parameters =
{ key1: 'value1',
  'key2[key1]': 'value1',
  'key2[key2]': 'value2',
  'key2[key3]': 'value3',
  'key2[key4]': 'value4',
  key3: 'value3',
  key4: 'value4' }
我的服务器发送了一个错误,说parameters.key2未定义

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

如何使用AFJSONRequestOperation获得与以前相同的编码?
是否有人可以在这方面提供帮助

谢谢


为MATTT编辑:

下面是我如何使用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;
}
非常感谢你的帮助


Seb

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

下文对此进行了解释:

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

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


您之所以得到这个结果,是因为您正在访问递归字典的值。如果要获取值,请尝试这样做:-NSDictionary*dict=[dico2objectforkey:@“key2”];NSString*str=[dict objectForKey:@“key2”];NSLog(@“str=%@”,str)@侯赛因沙比尔:谢谢你的回答。我理解,但我的问题实际上不是来自“客户端”,而是来自服务器端:服务器接收的JSON数据编码方式与NSJSONSerialization/NSURLConnection和AFJSONRequestOperation不同……您使用的是最新版本的AFNetworking吗?(1.x或2.x?)@AaronBrager:我使用的是1.3.2版本?
-(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;
}