2013-10-09 4 views
1

Lorsque je fais un POST d'un objet, la réponse est mappée sur un mauvais objet.Réponse POST RestKit avec un mappage incorrect

// Resquest for post new article 

RKObjectMapping* articleRequestMapping = [RKObjectMapping requestMapping]; 
[articleRequestMapping addAttributeMappingsFromDictionary:@{ 
                @"title" : @"title", 
                @"body" : @"body", 
                }]; 

RKRequestDescriptor *requestDescriptorArticle = [RKRequestDescriptor 
               requestDescriptorWithMapping:articleRequestMapping 
               objectClass:[Article class] 
               rootKeyPath:nil 
               method:RKRequestMethodPOST]; 

[objectManager addRequestDescriptor:requestDescriptorArticle]; 


// Response for post new article 
// response.body={ 
// "result": { 
//  "ok": 1 
// } 
// } 

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[Result class]]; 
[resultMapping addAttributeMappingsFromDictionary:@{ 
                @"ok" : @"ok" 
                }]; 

RKResponseDescriptor *resArticleCreate = [RKResponseDescriptor 
              responseDescriptorWithMapping:resultMapping 
              method:RKRequestMethodPOST 
              pathPattern:[NSString stringWithFormat:@"%@%@",apiVersion,@"/articles"] 
              keyPath:@"result" 
              statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:resArticleCreate]; 

Le journal:

2013-10-09 07:05:43.335 TabbedDemo[35156:4703] D restkit.object_mapping:RKMapperOperation.m:378 Executing mapping operation for representation: { 
    result =  { 
     ok = 1; 
    }; 
} 
and targetObject: <Article: 0x7d88670> 

targetObject est l'article ..., mais il censé être ... Résultat

Je trouve la vieille question similaire ici: https://github.com/RestKit/RestKit/issues/1081 J'utilise v0.21 (branche master), maintenant je le résous en forçant targetObject.

// normal one, but with wrong mapping object. 

// [[RKObjectManager sharedManager] postObject:article path:nil parameters:@{@"_csrf" : self._csrf} 
//          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){ 
//           NSLog(@"result:%@",[mappingResult firstObject]); 
//          } 
//          failure:^(RKObjectRequestOperation *operation, NSError *error) { 
//           NSLog(@"Hit error: %@", error); 
//          }]; 

RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:article 
                     method:RKRequestMethodPOST 
                     path:nil 
                     parameters:@{@"_csrf" : self._csrf}]; 
Result *r1 = [Result new]; 
operation.targetObject = r1; 

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    NSLog(@"result:%@",[mappingResult firstObject]); 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"Hit error: %@", error); 
}]; 

[operation start]; 

Est-ce un problème RestKit ou je fais mal?

Répondre

1

Il s'agit d'une hypothèse de conception RestKit. Cela cause des problèmes dans certains cas comme le vôtre. Lors de la publication et de l'objet, RestKit essaiera toujours de mapper la réponse dans ce même objet.

Votre solution de contournement est une bonne alternative.

Vous pouvez également publier un dictionnaire et renvoyer le résultat dans ce dictionnaire.

+0

Merci. Ce qui me rend confus est pourquoi j'ai besoin de RestKit au lieu de faire ces trucs avec AFNetworking et JSON par moi-même. J'ai passé trop de temps à essayer de le faire fonctionner, comme mappage d'objets, routage de requête, mappage de sous-objet, mappage dynamique, ... Et enfin, je dois faire quelque chose à l'ancienne et perdre la flexibilité de gérer un protocole arbitraire . – blackgun

+0

Vous pouvez utiliser AFNetworking, et vous devez l'utiliser lorsque RestKit n'est pas efficace ou est trop puissant. Vous pouvez toujours faire quelque chose d'hybride lorsque vous utilisez AFNetworking pour obtenir la réponse JSON et ensuite utiliser une opération de mappeur RestKit ... Comment vous décidez de ce qu'il faut utiliser et quand il s'agit d'expérimenter. – Wain

Questions connexes