2013-03-11 14 views
5

Piszę aplikację na iOS, która współdziała z usługą, aby zaktualizować profil użytkownika. W celu aktualizacji nazwy użytkownika, aplikacja iOS stawia wniosek o treści następującej formie:Nie można obsłużyć pomyślnej odpowiedzi 204 i poprawnie odwzorować awaryjną odpowiedź za pomocą narzędzia RestKit

{"name" : {"first" : "FIRSTNAMEGOESHERE", "lastName":"LASTNAMEGOESHERE"}} 

W przypadku gdy organ wniosek jest prawidłowy (czyli zarówno imię i nazwisko są przewidziane) usługa zwraca kod statusu 204 (brak zawartości) i pustą treść odpowiedzi.

W przypadku gdy organ wniosek jest nieważny (np imię brakuje, itd.), Usługa zwróci kod statusu 400 i korpus odpowiedzi w następującym formacie:

{"code":"ERRORCODEHERE"} 

The Aplikacja dla systemu iOS korzysta z narzędzia RestKit i nie udało mi się ustalić, w jaki sposób można go poprawnie obsłużyć w przypadku niepowodzenia i sukcesu. Jeśli używam to:

- (void)updateUserName 
{ 
    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[[NSURL alloc] initWithString:@"http://someqaserver:8080"]]; 
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON]; 

    RKObjectMapping *userMapping = [RKObjectMapping requestMapping]; 
    [userMapping addAttributeMappingsFromDictionary:@{@"firstName" : @"first", @"lastName" : @"last"}]; 

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userMapping objectClass:[OurUser class]          rootKeyPath:@"name"]; 

    [objectManager addRequestDescriptor:requestDescriptor]; 

    [objectManager putObject:[OurUser getCurrentUser] 
        path:@"/mobile/profile/name" 
        parameters:nil 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *result) 
        { 
        NSLog(@"Success!"); 
        } 
        failure:^(RKObjectRequestOperation *operation, NSError *error) 
        { 
        NSLog(@"Fail!"); 
        }]; 
} 

To oczywiście nie działa w przypadku błędu, ale to nie z powodzeniem wykonać blok sukcesu w przypadku gdy 204 jest zwracany z serwera.

Jeśli dodać następujący kod przed wywołaniem putObject, błąd obsługi działa, ale teraz ważne 204 sprawa jest traktowana jako awaria:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[ServiceError class]]; 
    [errorMapping addAttributeMappingsFromDictionary:@{@"code" : @"errorCode"}]; 
    RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)]; 
    [objectManager addResponseDescriptor:errorDescriptor]; 

Wydaje się to zdarzyć, ponieważ kody stanu Zaakceptowany HTTP są teraz ustawione do tych deskryptorów odpowiedzi dostarczone i 204 nie jest jednym z nich (a może to coś innego?)

jak mogę go tak, że: 1.), jeśli zwracana jest 204, to postrzegane jako sukces 2.) Jeśli zwracane jest 4XX, jest to postrzegane jako błąd, a kod błędu jest poprawnie odwzorowany na moje Servi Obiekt ceError?

Z góry dziękujemy za wszelką pomoc, jaką możesz zapewnić.

Odpowiedz

2

Problem został rozwiązany przez dodanie również deskryptor odpowiedzi do obsługi 204:

RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil] 
                           method:RKRequestMethodPUT 
                          pathPattern:nil 
                           keyPath:nil 
                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[manager addResponseDescriptor:successResponseDescriptor]; 
0

kod 204 nie jest błędem, każdy status 2xx jest uważany za sukces. 204 oznacza "brak treści", co jest całkowicie poprawną odpowiedzią. Jeśli spodziewasz się, że restkit potraktuje to jako błąd, zrób błąd 3xx, 4xx lub 5xx. W twoim przypadku używasz RKStatusCodeClassClientErrorm, co sugeruje, że powinieneś rzucić błąd 4xx.

Zobacz wikipedia Pełną listę kodów błędów

+0

Chyba źle. Wiem, że 204 jest prawidłową odpowiedzią. Problem polegał na tym, że ten kod uważał 204 za sukces, jednocześnie dodając odpowiedni deskryptor odpowiedzi, aby kody błędów były mapowane po otrzymaniu 400. – Kathleen

Powiązane problemy