iOS RestKit 自定义错误处理

Posted

技术标签:

【中文标题】iOS RestKit 自定义错误处理【英文标题】:iOS RestKit custom error handling 【发布时间】:2015-09-05 10:00:41 【问题描述】:

我正在尝试寻找一种处理 API 结果的最佳方式。我浏览了许多教程和指南,但没有一个能够指导我如何正确处理来自 API 的自定义错误。

我发现我遵循的最好的教程是这个,但我仍然错过了最后一部分 - 错误处理:

http://www.nsscreencast.com/episodes/51-intro-to-restkit-mapping

我们项目中的每个 API 函数(GET、POST、PUT 和 DELETE)都会返回以下 JSON 输出:

result: TRUE/FALSE, data:(string, object or array), error_message:"custom error message"

如果结果为 TRUE,则返回数据,否则返回 error_message。每个请求都返回代码 200 或 404 作为结果,但只有在未找到 API URL 时才返回 404。这是获取特定国家/地区城市的示例。如果我尝试从不在数据库中的国家/地区获取城市,API 会返回 FALSE 和自定义错误消息。

问题是,我该如何处理这种情况?

LocalityCity.h

@interface LocalityCity : NSObject

@property (nonatomic) int idCity;
@property (nonatomic, strong) NSString *name;

@end

RestMappingProvider.m

+ (RKObjectMapping *)localityCityMapping

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[LocalityCity class]];

    [mapping addAttributeMappingsFromDictionary:@
                                                  @"id": @"idCity",
                                                  @"name": @"name",
                                                  ];

    return mapping;

RestDescriptorProvider.m

+ (void)localityCityDescriptor

    RKResponseDescriptor *responseDescriptorGet =
    [RKResponseDescriptor responseDescriptorWithMapping:[RestMappingProvider localityCityMapping]
                                                 method:RKRequestMethodGET
                                            pathPattern:@"/api/locality/cities/:id"
                                                keyPath:nil
                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

    [[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptorGet];

LocalityCityViewController.m

@interface CityViewController ()

@property (nonatomic, strong) NSArray *cities;

@end

@implementation CityViewController

- (void)viewDidLoad

    [super viewDidLoad];

    [[RestDescriptorProvider localityCityDescriptor];
    [[RKObjectManager sharedManager] getObject:self.cities
                                          path:@"/api/locality/cities/2"
                                    parameters:nil
                                       success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                                           NSLog(@"OK");
                                        failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                           NSLog(@"Error");
                                       ];

【问题讨论】:

【参考方案1】:

理想情况下,Web 服务会使用其中一个 HTTP 状态代码来告诉客户端存在问题,然后您可以使用专门的响应描述符和 NSError 来处理该问题。

您可以使用动态 mping 检查结果类型并确定如何处理结果。根据标志值,将应用不同的映射来创建具有适当详细信息的不同结果类供您使用。具体如何处理取决于您,可以通过类类型检查,或者让您的模型对象返回“成功”标志,可能由协议支持。

【讨论】:

谢谢韦恩。我尝试了动态映射,但它不起作用(RestKit 无法将发布请求的结果映射到发起请求的对象以外的另一个对象)。但是,我将 API 更改为在发生错误时返回 4** 代码而不是 200,我认为这是最好的解决方案。

以上是关于iOS RestKit 自定义错误处理的主要内容,如果未能解决你的问题,请参考以下文章

ios - Restkit 和 SSL 证书错误

使用 Moya + RxSwift 处理自定义错误响应

自定义错误处理器

17)错误处理

PHP:自定义错误处理程序 - 处理解析和致命错误

python 自定义错误处理