iOS RestKit 自定义错误处理
iOS RestKit custom error handling
我正在尝试找到处理 API 结果的最佳方法。我浏览了许多教程和指南,但其中 none 能够为我提供如何正确处理来自 API.
的自定义错误的指导
我发现我遵循的最好的教程是这个,但我仍然缺少最后一部分 - 错误处理:
http://www.nsscreencast.com/episodes/51-intro-to-restkit-mapping
我们项目 returns 中的每个 API 函数(GET、POST、PUT 和 DELETE)都遵循 JSON 输出:
{result: TRUE/FALSE, data:(string, object or array), error_message:"custom error message"}
如果结果为真,则返回数据,否则返回error_message。结果每个请求 returns 代码为 200 或 404,但仅当 API URL 未找到时才返回 404。这是获取特定国家/地区城市的示例。如果我尝试从不在数据库中的国家/地区获取城市,API returns 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");
}];
}
理想情况下,Web 服务会使用一种 HTTP 状态代码来告诉客户端存在问题,然后您可以使用专门用于处理该问题的响应描述符和 NSError
.
您可以使用动态 mping 检查结果类型并确定如何处理结果。根据标志值,将应用不同的映射来创建不同的结果 class,并提供适当的详细信息供您使用。具体如何处理取决于您,可以使用 class 类型检查,或者让您的模型对象 return 一个 'success' 标志,可能由协议支持。
我正在尝试找到处理 API 结果的最佳方法。我浏览了许多教程和指南,但其中 none 能够为我提供如何正确处理来自 API.
的自定义错误的指导我发现我遵循的最好的教程是这个,但我仍然缺少最后一部分 - 错误处理:
http://www.nsscreencast.com/episodes/51-intro-to-restkit-mapping
我们项目 returns 中的每个 API 函数(GET、POST、PUT 和 DELETE)都遵循 JSON 输出:
{result: TRUE/FALSE, data:(string, object or array), error_message:"custom error message"}
如果结果为真,则返回数据,否则返回error_message。结果每个请求 returns 代码为 200 或 404,但仅当 API URL 未找到时才返回 404。这是获取特定国家/地区城市的示例。如果我尝试从不在数据库中的国家/地区获取城市,API returns 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");
}];
}
理想情况下,Web 服务会使用一种 HTTP 状态代码来告诉客户端存在问题,然后您可以使用专门用于处理该问题的响应描述符和 NSError
.
您可以使用动态 mping 检查结果类型并确定如何处理结果。根据标志值,将应用不同的映射来创建不同的结果 class,并提供适当的详细信息供您使用。具体如何处理取决于您,可以使用 class 类型检查,或者让您的模型对象 return 一个 'success' 标志,可能由协议支持。