2013-03-11 11 views
5

Ich schreibe eine iOS-App, die mit einem Dienst interagiert, um das Profil eines Benutzers zu aktualisieren. Um den Namen eines Benutzers zu aktualisieren, legt der iOS-App eine Anfrage mit einem Körper aus folgendem Format:Kann keine erfolgreiche Antwort von 204 verarbeiten und fehlerhafte Antwort mit RestKit korrekt zuordnen

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

In dem Fall, dass der Antrag Körper gültig ist (dh sowohl ein Vor- und Nachnamen werden zur Verfügung gestellt), Der Dienst gibt einen Statuscode 204 (Kein Inhalt) und einen leeren Antworttext zurück.

In dem Fall, dass der Antrag Körper ungültig ist (zB Vorname fehlt, etc.), wird der Dienst einen Statuscode 400 zurückgeben und einen Antworttext in folgendem Format:

{"code":"ERRORCODEHERE"} 

Der Die iOS-App verwendet RestKit und ich konnte nicht herausfinden, wie ich es erhalten kann, um den Erfolgs- und Fehlerfall richtig zu behandeln. Wenn ich diese verwenden:

- (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!"); 
        }]; 
} 

Das ist offensichtlich nicht für den Fehlerfall funktioniert, aber es erfolgreich den Erfolg Block in dem Fall ausführt, wo ein 204 vom Server zurückgegeben wird.

Wenn ich den folgenden Code vor dem Aufruf putObject, die Fehlerbehandlung Werke hinzufügen, aber jetzt ist der gültige 204 Fall wird ein Ausfall als:

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]; 

Dies scheint da die akzeptiert HTTP-Statuscodes geschehen sind nun eingestellt zu denen der Antwort-Deskriptoren zur Verfügung gestellt und 204 ist nicht einer von ihnen (oder vielleicht ist es etwas anderes?)

wie kann ich es bekommen, dass so: 1.), wenn ein 204 zurückgeführt wird, ist es als Erfolg gesehen 2.) Wenn eine 4XX zurückgegeben wird, wird dies als Fehler angesehen und der Fehlercode ist korrekt auf meinen Servi abgebildet ceError Objekt?

Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.

Antwort

2

Das Problem, indem auch das Hinzufügen einer Antwort-Descriptor gelöst wurde, die 204 zu handhaben:

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

Code 204 ist kein Fehler, jeder Status von 2xx wird als Erfolg gewertet. 204 bedeutet 'kein Inhalt', was eine absolut gültige Antwort ist. Wenn Sie erwarten, dass Restkit es als Fehler behandelt, stellen Sie sicher, dass Sie einen 3xx-, 4xx- oder einen 5xx-Fehler auslösen. In Ihrem Fall verwenden Sie einen RKStatusCodeClassClientErrorm, der vorschlägt, dass Sie einen 4xx-Fehler werfen sollten.

Siehe wikipedia für eine vollständige Liste der Fehlercodes

+0

Ich glaube, du falsch verstanden. Ich weiß, dass 204 eine gültige Antwort ist. Das Problem bestand darin, dass dieser Code 204 als Erfolg betrachtete, während gleichzeitig der entsprechende Antwortdeskriptor hinzugefügt wurde, so dass Fehlercodes zurückgemeldet wurden, wenn eine 400 empfangen wurde. – Kathleen

Verwandte Themen