【问题标题】:How to handle failures from a Restful webservice calls in iOS Objective C?如何在 iOS Objective C 中处理来自 Restful Web 服务调用的失败?
【发布时间】:2016-06-15 10:48:45
【问题描述】:

我正在使用AFNetworking 从应用程序调用网络服务。一切正常。由于我是 iOS 开发的新手,我以某种方式使事情顺利进行,但我想学习实现东西的正确方法并处理各种情况。

下面是AFNetwork工作代码:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:url]];[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject)
{
    NSLog(@"Success");
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
    NSLog(@"Error: %@", error);
}];

当我进行服务调用时,如果调用失败(由于网络连接不佳),那么在失败块中我该如何处理?假设这是一个重要的服务调用,如 login service 那么我不能放弃并且需要再次调用该服务。我浏览了很多,但到处都显示 UIAlert 说没有连接。但是如果第一次通话失败,我不想使用警报...

我应该延迟调用服务还是有其他解决方案?如果你们中的任何人更好地处理了这种情况,请回复...

【问题讨论】:

  • 一般登录web服务不会在失败时自动触发。我们只是显示一个弹出窗口,要求用户稍后再试。或者我们可能会显示类似“网络故障”的弹出窗口。你想尝试再次登录吗?有 2 个选项是 - 否。如果用户点击是,你再次调用网络服务。

标签: ios objective-c web-services rest afnetworking


【解决方案1】:

一般来说,我们只是简单地显示错误提示或警告,并进行相应的处理。如果您在失败块中看到有 2 个参数 AFHTTPRequestOperation *operation 和 NSError *error。根据状态代码,您可以在故障块中添加逻辑。我已经添加了示例代码

状态码列表:- https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:url]];[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject)
 {
     NSLog(@"Success");
 }
failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     NSInteger statusCode = operation.response.statusCode;
     if(statusCode == 401) {
        //Add your logic
     } else if (statusCode == 404) {
        //Add your logic
     }
 }];

【讨论】:

  • 看来,在您的故障处理程序代码中,您假设网络请求返回了响应 - 因此成功。您忽略了根本没有得到回应的可能性。这是主机不可访问的情况。只是由于 Objective-C 语言的特殊性,当响应为nil 时,语句operation.response.statusCode 将返回0。另请注意,您可能会在成功处理程序中获得任何 HTTP 状态代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多