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ć.
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