2013-08-01 3 views
1

Le service REST que je consomme dispose de deux modes de réponse différents.Mappage basé sur la valeur de la réponse JSON dans RestKit

{ 
success: true, 
data: { //all data goes here} 
} 

ou

{ 
success: false, 
error: "Error", 
message: "some message" 
} 

Je suis en train de configurer RESTKit pour retourner un certain objet d'erreur que j'ai créé pour stocker la réponse d'erreur et une classe configurée (basé sur l'URL) pour la réussite = vrai cas.

J'essaye d'employer un RKDynamicMapping pour accomplir ceci basé sur la valeur de "succès".

- (RKDynamicMapping *)createCompatibleMapping:(NSDictionary *)successDictionary withClass:(Class) class{ 
     NSMutableDictionary *withSuccessDictionary = [NSMutableDictionary dictionaryWithDictionary:successDictionary]; 
     [withSuccessDictionary addEntriesFromDictionary:@{@"success" : @"success"}]; 

    RKObjectMapping *successMapping = [RKObjectMapping mappingForClass:class]; 
    [successMapping addAttributeMappingsFromDictionary:withSuccessDictionary]; 

    RKObjectMapping *restErrorMapping = [RKObjectMapping mappingForClass:[RESTErrorObject class]]; 
    [restErrorMapping addAttributeMappingsFromDictionary:@{@"success" : @"success", @"error" : @"errorString", @"message" : @"message"}]; 

    RKDynamicMapping *dynamicMapping = [RKDynamicMapping new]; 


    [dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"success" expectedValue:[NSNumber numberWithBool:YES ] objectMapping:successMapping]]; 
    [dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"success" expectedValue:[NSNumber numberWithBool:NO ] objectMapping:restErrorMapping]]; 
    return dynamicMapping; 
} 

ajouter ensuite à un descripteur de réponse comme tel:

RKResponseDescriptor * cardDetailsResponseDescriptor2 = [RKResponseDescriptor responseDescriptorWithMapping:cardDetailsResponseMapping method:RKRequestMethodGET 
                            pathPattern:@"services/details/:cardNumber" keyPath:@"data" 
                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

[_objectManager.router.routeSet addRoute:[RKRoute routeWithName:@"getCardDetailsRoute" pathPattern:@"services/details/:cardNumber" method:RKRequestMethodGET]]; 

Je puis appeler

[self.objectManager getObjectsAtPathForRouteNamed:@"getCardDetailsRoute" object:card parameters:@{@"token" : authToken} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 

Je sais que c'est un grand message et peut-être difficile à comprendre . J'apprécie votre patience: D Donc confus sur ce que je devrais faire.

La modification de l'API REST n'est pas vraiment une option.

+1

Qu'est-ce que 'cardDetailsResponseMapping'? Le descripteur de réponse doit utiliser 'dynamicMapping'. – Wain

+0

cardDetailsResponseMapping est un mappage dynamique. – bobber205

+0

'un' mappage dynamique, différent de celui que vous avez montré dans le code? – Wain

Répondre

0

Essayez de définir la valeur attendue sur @ "true" @ "false". Je pense que les valeurs seront des chaînes au moment de l'exécution du mappage dynamique et qu'elles seront uniquement converties en BOOL pendant le mappage et si le type de destination est un BOOL.

Questions connexes