2013-01-06 10 views
10

Ho bisogno di creare due diversi tipi di POST provenienti dalla classe User.Aggiunta di due descrittori di richieste per una determinata classe in Restkit 0.2

//JSON Type A 
{ 
    "password":"12345", 
    "email":"[email protected]" 
} 

//JSON Type B 
{ 
    "user":{ 
     "Password":"12345", 
     "Email":"[email protected]" 
    } 
} 

Ho cercato di fare due descrittori di richiesta e di aggiungerli al mio manager oggetto tuttavia ho l'errore

"Non è possibile aggiungere un descrittore di richiesta per la stessa classe di oggetti come richiesta esistente descrittore."

Il mio codice

@interface User : NSObject 

@property (nonatomic, retain) NSString * userID; 
@property (nonatomic, retain) NSString * email; 
@property (nonatomic, retain) NSString * password; 
@property (nonatomic, retain) NSString * firstName; 
@property (nonatomic, retain) NSString * lastName; 

@end 

- (void)setupUserMapping:(RKObjectManager *)objectManager { 

    // Setup user response mappings 
    RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]]; 
    [userMapping addAttributeMappingsFromDictionary:@{ 
    @"ID" :@"userID", 
    @"Email" : @"email", 
    @"Password" : @"password", 
    @"FirstName" : @"firstName", 
    @"LastName" : @"lastName", 
    }]; 


    RKResponseDescriptor *responseDescriptorAuthenticate = [RKResponseDescriptor responseDescriptorWithMapping:userMapping 
                         pathPattern:@"/Authenticate" 
                          keyPath:nil 
                         statusCodes:[NSIndexSet indexSetWithIndex:200]]; 


    RKResponseDescriptor *responseDescriptorRegister = [RKResponseDescriptor responseDescriptorWithMapping:userMapping 
                            pathPattern:@"/Register" 
                             keyPath:nil 
                            statusCodes:[NSIndexSet indexSetWithIndex:200]]; 
    [objectManager addResponseDescriptor:responseDescriptorRegister]; 
    [objectManager addResponseDescriptor:responseDescriptorAuthenticate]; 

    // Setup user request mappings 
    RKObjectMapping* userRequestMappingForRegister = [RKObjectMapping requestMapping]; 
    [userRequestMappingForRegister addAttributeMappingsFromDictionary:@{ 
    @"email" : @"Email", 
    @"password" : @"Password", 
    @"firstName" : @"FirstName", 
    @"lastName" : @"LastName", 
    }]; 
    RKRequestDescriptor *requestDescriptorForRegister = [RKRequestDescriptor requestDescriptorWithMapping:userRequestMappingForRegister objectClass:[User class] rootKeyPath:@"user"]; 


    RKObjectMapping* userRequestMappingForAuthenticate = [RKObjectMapping requestMapping]; 
    [userRequestMappingForAuthenticate addAttributeMappingsFromDictionary:@{ 
    @"userID" :@"ID", 
    @"email" : @"email", 
    @"password": @"password" 
    }]; 
    RKRequestDescriptor *requestDescriptorForAuthenticate = [RKRequestDescriptor requestDescriptorWithMapping:userRequestMappingForAuthenticate objectClass:[User class] rootKeyPath:nil]; 

    [objectManager addRequestDescriptor:requestDescriptorForRegister]; 
    [objectManager addRequestDescriptor:requestDescriptorForAuthenticate]; 
} 

Qualcuno sa come posso risolvere questo problema senza creare una classe separata per queste richieste?

Qualsiasi aiuto è apprezzato.

Grazie.

risposta

5

È possibile utilizzare una mappatura dinamica per cambiare i comportamenti di serializzazione. Se questo è un problema abbastanza comune, potremmo ipoteticamente aggiungere la corrispondenza del percorso al descrittore della richiesta. Non ho avuto un sacco di richieste per una funzione del genere.

V'è un esempio di come utilizzare la mappatura dinamica con una richiesta nei test di unità: https://github.com/RestKit/RestKit/blob/master/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m#L495-L534

+0

Grazie per l'esempio Blake! Spero che diventi un problema comune! =) –

+0

Blake - Ho avuto lo stesso problema di recente e ho usato due istanze di ObjectManager (ammesso che fossero per oggetti molto diversi). È la migliore pratica consigliata? – bobtheowl2

+7

"Se questo è un problema abbastanza comune, potremmo aggiungere la corrispondenza del percorso al descrittore della richiesta" - se questa può essere considerata una proposta di funzionalità, +1 per esso :) – MrTJ

Problemi correlati