问题从AFNetworking 1.3迁移到AFNetworking 2.0

时间:2013-10-06 16:01:28

标签: ios afnetworking afnetworking-2

我正在尝试将项目从AFNetworking 1.3迁移到AFNetworking 2.0。

在AFNetworking 1.3项目中,我有这段代码:

- (void) downloadJson:(id)sender
{

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myServer/api/call?param1=string1&param2=string2"]];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        // handle success

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"%ld", (long)[response statusCode]);

        NSDictionary *data = JSON;
        NSString *errorMsg = [data objectForKey:@"descriptiveErrorMessage"];
        // handle failure

    }];

    [operation start];

}

当客户端发送格式不正确或参数错误的网址时,服务器会发回400错误并包含JSON,其中包含我在故障块中读取的“descriptiveErrorMessage”。我使用这个“descriptiveErrorMessage”来确定url的错误,并在适当的时候向用户发送消息。

AFNetworking 2.0项目的代码如下所示:

- (void)downloadJson:(id)sender
{
 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myServer/api/call?param1=string1&param2=string2"]];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        // handle success

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        // any way to get the JSON on a 400 error?

    }];

    [operation start];
}

在AFNetworking 2.0项目中,我没有看到任何方法让JSON读取服务器发送的“descriptiveErrorMessage”。我可以在操作中从NSHTTPURLResponse获取响应头,但就我而言,也许我错过了一些东西。

有没有办法在失败块中获取JSON?如果没有,任何人都可以提出更好的方法吗?

提前感谢您对此问题的任何帮助。

2 个答案:

答案 0 :(得分:4)

我认为您可以尝试访问传递的responseData参数的operation属性到您的失败块。

不确定它是否包含服务器发回的JSON数据,但所有信息都应该在那里。

希望它有所帮助。

答案 1 :(得分:1)

我找到了更好的解决方案。 我使用了'AFHTTPRequestOperationManager'

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager GET:@"http://localhost:3005/jsondata" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"Result: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@", [error localizedDescription]);
}];