从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题

Posted

技术标签:

【中文标题】从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题【英文标题】:Issue migrating from AFNetworking 1.3 to AFNetworking 2.0 【发布时间】:2013-10-06 16:01:28 【问题描述】:

我正在尝试将项目从 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];


当客户端发送的 url 格式不正确或参数错误时,服务器会发回 400 错误,并包含带有“descriptiveErrorMessage”的 JSON,我在失败块中读取了该 URL。我使用这个“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?如果没有,任何人都可以提出更好的方法吗?

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

【问题讨论】:

【参考方案1】:

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

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

希望对你有帮助。

【讨论】:

谢谢@sergio,这行得通。我错过了 responseData 属性。它以 NSData 的形式出现,但我将其序列化为 JSON,并且能够从服务器检索消息。【参考方案2】:

我找到了更好的解决方案。 我用过'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]);
];

【讨论】:

以上是关于从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 从 1.x 迁移到 3.x

从 Objective-C 迁移到 Swift:AFNetworking > Alamofire

AFNetworking 3.0 迁移

AFNetworking 3.0迁移指南

从 Cake 1.3 迁移到 2.0 及更高版本 - 迁移现有的,还是仅用于新的?

从 angularJS 1.3-beta 迁移到 1.4 后,$http 帖子无法正常工作