Question

Je suis relativement nouveau à Objective-C et je tente d'utiliser RestKit pour recevoir une réponse JSON d'un service Web. J'ai reçu avec succès le dos à ma demande de données, qui ressemble à ceci considérer la réponse:

{id:"1","Translation":"Test"}

Je voudrais mapper cette traduction à mon « traduction » objet dans ma demande, mais ont essayé quelques façons différentes, mais ne suis pas sûr de savoir comment y parvenir.

Alors mes questions sont:

  1. Comment puis-je mapper cette réponse à mon objet de traduction
  2. Suis-je faire cela correctement, la création d'une méthode pour compléter cet appel OutWit mon contrôleur de vue?

My Translation objet

@implementation Translation  

@synthesize identifier = _identifier;
@synthesize translation = _translation;

- (NSDictionary*)elementToPropertyMappings {  
return [NSDictionary dictionaryWithKeysAndObjects:  
        @"id", @"identifier",  
        @"translation", @"translation",
        nil];  
}  

@end

My Traduire Méthode

- (NSString *)performTranslation:(NSString *)translation
{

NSString *data = [[NSString alloc] initWithFormat:@"{\"SourceId\": \"%@\",\"RegionTag\": \"%@\",\"InputString\": \"%@\"}", @"1", @"Glasgow", translation];
NSString *post = data;

RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://my.url.com/Translation/Translate"]];
MyRequest.method = RKRequestMethodPOST;
MyRequest.HTTPBodyString = post;
MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];
[MyRequest send];

RKResponse *Response = [MyRequest sendSynchronously];

return Response.bodyAsString; <--- looking to map this to translation object here

}
Était-ce utile?

La solution

L'extrait de votre code semble un peu vieillot. Je recommande fortement de lire le plus récent pour à l'effet de levier dans RestKit plein potentiel de - surtout la partie cartographie sans KVC .

Edit:

Pour poster un objet avec RestKit et recevoir en retour une réponse, nous définissons une classe TranslationRequest qui tiendra notre demande et Translation de tenir notre réponse.

Tout d'abord, nous avons mis en place notre RKObjectManager et applications (je fais habituellement dans mon AppDelegate):

RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:kOurBaseUrl];
[manager setSerializationMIMEType:RKMIMETypeJSON];
//this is a singleton, but we keep the manager variable to avoid using [RKObjectManager sharedManager] all the time

//Here we define a mapping for the request. Note: We define it as a mapping from JSON to entity and use inverseMapping selector later.
RKObjectMapping *translationRequestMapping = [RKObjectMapping mappingForClass:[TranslationRequest class]];
[translationRequestMapping mapKeyPath:@"RegionTag" toAttribute:@"regionTag"];
...
[[manager mappingProvider] setSerializationMapping:[translationRequestMapping inverseMapping] forClass:[TranslationRequest class]];

//now we define the mapping for our response object
RKObjectMapping *translationMapping = [RKObjectMapping mappingForClass:[Translation class]];
[translationMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[translationMapping mapKeyPath:@"Translation" toAttribute:@"translation"];
[[manager mappingProvider] addObjectMapping:mapping];

//finally, we route our TranslationRequest class to a given endpoint
[[manager router] routeClass:[TranslationRequest class] toResourcePath:kMyPostEndpoint];

Cela devrait être suffisant de la configuration nécessaire. Nous pouvons appeler notre back-end partout dans le code (par exemple dans un contrôleur) comme ceci:

//we create new TranslationRequest
TranslationRequest *request = [[TranslationRequest alloc] init];
[request setRegionTag:@"Hello"];
....
//then we fetch the desired mapping to map our response with
RKObjectMapping *responseMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:class]
//and just call it. Be sure to let 'self' implement the required RKObjectManagerDelegate protocol
[[RKObjectManager sharedManager] postObject:request mapResponseWith:responseMapping delegate:self];]

Essayez cette approche et laissez-moi savoir si vous avez besoin d'aide .. Je n'ai pas pu tester pleinement que je n'ai pas backend approprié qui renverra les réponses, mais à en juger du journal RestKit cela devrait fonctionner.

Autres conseils

Vous devez passer la chaîne JSON retournée dans un analyseur JSON. J'utilise SBJSON . Vous pouvez ensuite utiliser le dictionnaire résultant pour remplir les propriétés de votre objet.

RestKit semble avoir des objets natifs qui encapsulent quatre parseurs JSON. Cependant, je vous conseille la prudence parce qu'ils semblent supposer que le niveau supérieur objet analysé sera toujours un dictionnaire.

Comme autre côté, l'exemple dans votre question n'est pas valide JSON. Il devrait ressembler à ceci:

{"id":"1","Translation":"Test"}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top