从 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¶m2=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¶m2=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 的问题的主要内容,如果未能解决你的问题,请参考以下文章
从 Objective-C 迁移到 Swift:AFNetworking > Alamofire