2013-03-11 13 views
5

Sto scrivendo un'app iOS che interagisce con un servizio per aggiornare il profilo di un utente. Per aggiornare il nome di un utente, l'applicazione iOS mette una richiesta con un corpo del seguente formato:Impossibile gestire correttamente la risposta 204 e mappare correttamente la risposta di errore utilizzando RestKit

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

nel caso in cui il corpo della richiesta è valido (cioè un nome e cognome entrambi sono forniti), il servizio restituisce un codice di stato 204 (Nessun contenuto) e un corpo di risposta vuoto.

Nel caso in cui il corpo della richiesta è valida (ad esempio nome è mancante, ecc), il servizio restituirà un codice di stato 400 e un corpo di risposta nel seguente formato:

{"code":"ERRORCODEHERE"} 

L' L'app per iOS utilizza RestKit e non sono riuscito a capire come ottenerlo per gestire correttamente il caso di successo e di insuccesso. Se io uso questo:

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

Questo ovviamente non funziona per il caso di errore, ma lo fa eseguire con successo il blocco di successo nel caso in cui un 204 viene restituito dal server.

Se posso aggiungere il seguente codice prima di chiamare putObject, la movimentazione opere errore, ma ora il 204 valido caso è considerato un fallimento:

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

Questo sembra accadere dal momento che i codici di stato accettato HTTP sono impostate a quelli dei descrittori di risposta fornite e 204 non è uno di loro (o forse è qualcosa d'altro?)

come posso ottenere in modo che: 1.) se un 204 viene restituito, è visto come un successo 2.) se viene restituito un 4XX, è visto come un errore e il codice di errore è mappato correttamente al mio Servi oggetto ceError?

Grazie in anticipo per qualsiasi aiuto è possibile fornire.

risposta

2

Il problema è stato risolto anche l'aggiunta di un descrittore di risposta per gestire il 204:

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

codice 204 non è un errore, qualsiasi stato 2xx è considerato un successo. 204 significa "nessun contenuto", che è una risposta perfettamente valida. Se si prevede che il restkit lo consideri un errore, assicurarsi di lanciare un errore 3xx, 4xx o 5xx. Nel tuo caso stai utilizzando un RKStatusCodeClassClientErrorm che suggerirebbe di generare un errore 4xx.

Vedi wikipedia per una lista completa dei codici di errore

+0

Credo che tu frainteso. So che 204 è una risposta valida. Il problema è stato ottenere questo codice per considerare un 204 come un successo aggiungendo anche il descrittore di risposta appropriato in modo che i codici di errore verrebbero mappati indietro quando è stato ricevuto un 400. – Kathleen

Problemi correlati