9

我正在向 AFHTTPClient 的实例发送以下消息。我希望成功块被发送一个 Foundation 对象(字典),但调试器显示 JSON 是一个 _NSCFData 对象。 这个关于 SO的问题表明我需要将 Accept 标头设置为“application/json”。好吧,我正在这样做,但 AFNetworking 仍然没有解码响应正文中的 JSON。如果我自己使用 NSJSONSerialization 解码 json,我会得到一个 NSDictionary,如我所料。我究竟做错了什么?

[client setDefaultHeader:@"Accept" value:@"application/json"];
[client postPath:@"/app/open_connection/"
  parameters:params
     success:^(AFHTTPRequestOperation *operation, id JSON) {
         NSLog(@"successful login! %@", [JSON valueForKeyPath:@"status"]);
     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"error opening connection");
         NSAlert *alert = [NSAlert alertWithError:error];
         [alert runModal];
     }
];

注意:我正在使用 Django 在 Python 中对服务器进行编程。响应的内容类型是 'application/json'

4

2 回答 2

6

当您使用AFHTTPClientJSON API 时,通常需要设置所有这三个设置:

httpClient.parameterEncoding = AFJSONParameterEncoding;
[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

现在,当您使用客户端发出请求时,它会知道将响应解析为 JSON。

[httpClient postPath:@"/app/open_connection/"
          parameters:params
             success:^(AFHTTPRequestOperation *operation, id response) {
                 NSLog(@"JSON! %@", response);
             }
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             }];

这也是我发现的一个技巧。在NSError对象中,您可以解析它并检索错误消息(如果 HTTP 响应有 JSON 错误消息):

failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSDictionary *JSON =
    [NSJSONSerialization JSONObjectWithData: [error.localizedRecoverySuggestion dataUsingEncoding:NSUTF8StringEncoding]
                                    options: NSJSONReadingMutableContainers
                                      error:nil];
           failureCallback(JSON[@"message"]);
}
于 2013-04-13T18:17:26.573 回答
3

试试这个......我认为您的客户端设置可能有问题。

NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"/app/open_connection/" parameters:params];

AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"successful login! %@", [JSON valueForKeyPath:@"status"]);
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"error opening connection");
        NSAlert *alert = [NSAlert alertWithError:error];
        [alert runModal];
}];
[operation start];
于 2012-08-08T21:18:33.953 回答