Я пытаюсь найти лучший способ обработки результатов API. Я просмотрел ряд руководств и руководств, но ни один из них не смог предоставить мне руководство по правильной обработке пользовательских ошибок из API.Индивидуальная обработка ошибок iOS RestKit
Лучший учебник я нашел, что я следовал это один, но я до сих пор отсутствует заключительная часть - обработка ошибок:
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, но 404 возвращается только в том случае, если URL-адрес API не найден. Вот пример получения городов в конкретной стране. Если я попытаюсь получить города из страны, которой нет в базе данных, 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");
}];
}
спасибо Wain. Я пробовал динамическое сопоставление, и он не работал (RestKit не смог сопоставить результат из почтового запроса другому объекту, отличному от того, который инициировал запрос). Тем не менее, я изменил API для возврата 4 ** кодов вместо 200 при возникновении ошибки, и я думаю, что это лучшее решение. –