2015-09-05 4 views
0

Я пытаюсь найти лучший способ обработки результатов 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"); 
             }]; 
} 

ответ

1

В идеале веб-сервис будет использовать один из кодов статуса HTTP, чтобы сообщить клиенту, была проблема, то вы можете использовать дескриптор ответа специально для обработки, что и NSError.

Вы можете использовать динамическое mping, которое проверяет тип результата и определяет, как обрабатывать результат. В зависимости от значения флага применяется другое сопоставление для создания другого класса результатов с соответствующими данными для использования. Именно то, как вы справляетесь с этим, зависит от вас, либо с проверкой типа класса, либо, возможно, что ваши объекты модели возвращают флаг «успех», возможно, поддерживаемый протоколом.

+0

спасибо Wain. Я пробовал динамическое сопоставление, и он не работал (RestKit не смог сопоставить результат из почтового запроса другому объекту, отличному от того, который инициировал запрос). Тем не менее, я изменил API для возврата 4 ** кодов вместо 200 при возникновении ошибки, и я думаю, что это лучшее решение. –

Смежные вопросы