objective-c json cocoa-touch post restkit

objective c - Haz un simple json POST usando RESTKit



objective-c cocoa-touch (2)

Soy nuevo en el desarrollo de iOS y tengo problemas para realizar una solicitud JT POST simple. Tengo un NSDictionary que contiene un usuario y una contraseña y quiero enviar esos valores como Json a un servidor y obtener una respuesta. Tuve que trabajar sin usar Restkit, pero no puedo encontrar la manera de lograrlo utilizando RestKit y simplemente no puedo encontrar un buen ejemplo de lo que quiero.

- (bool) login{ NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; [params setValue:self.email forKey:@"email"]; [params setValue:self.password forKey:@"password"]; NSMutableDictionary* rpcData = [[NSMutableDictionary alloc] init]; [rpcData setValue:@"2.0" forKey:@"jsonrpc"]; [rpcData setValue:@"authenticate" forKey:@"method"]; [rpcData setValue:@"" forKey:@"id"]; [rpcData setValue:params forKey:@"params"]; [[RKClient sharedClient] post:@"/api/rpc/" params:rpcData delegate:self]; return nil; }

El servidor está esperando un Json como este:

{ jsonrpc : ''2.0'', method : ''authenticate'', // method name goes here params : { // params are method-specific email : ''[email protected]'', password : ''secret'' }, id : 2 // The id can be anything, it will be sent back with the response }

Entiendo que hay un analizador Json incluido en RestKit pero no puedo encontrar ninguna documentación sobre cómo analizar mi diccionario rpcData, ¿necesito usar una biblioteca externa?

En este momento, la comunicación con el servidor está bien, pero no estoy enviando lo que se espera. Mi diccionario se asigna de la manera "clave = valor? Clave2 = valor2 ...". Esta es una pregunta muy tonta pero estoy atascado.

Actualizar

Cuando escribí esto, funcionó, pero Restkit se ha actualizado, así que no estoy seguro de si esto funcionará, por favor verifique su documentación.

Aquí está la solución a mi problema, lo que estoy haciendo es ideal para trabajar con las API de RPC cuando necesite llamar a un servicio:

1.- Primero en tu objeto necesitas importar Restkit y RKRequestSerialization, esto es muy importante:

#import <RestKit/RestKit.h> #import <RestKit/RKRequestSerialization.h> @interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate>

2.- Aquí está la función de inicio de sesión enviando la publicación:

- (void) login:(NSString *)username :(NSString *)password{ RKClient *myClient = [RKClient sharedClient]; NSMutableDictionary *rpcData = [[NSMutableDictionary alloc] init ]; NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; //User and password params [params setObject:password forKey:@"password"]; [params setObject:username forKey:@"email"]; //The server ask me for this format, so I set it here: [rpcData setObject:@"2.0" forKey:@"jsonrpc"]; [rpcData setObject:@"authenticate" forKey:@"method"]; [rpcData setObject:@"" forKey:@"id"]; [rpcData setObject:params forKey:@"params"]; //Parsing rpcData to JSON! id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON]; NSError *error = nil; NSString *json = [parser stringFromObject:rpcData error:&error]; //If no error we send the post, voila! if (!error){ [[myClient post:@"/" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self] send]; } }


Tuve el mismo problema, y ​​esto es lo que me lo resolvió. Tenga en cuenta que, en mi caso, solo quería acceder a RKRequest.

NSDictionarty *dict NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; if (!jsonData) { NSAssert(FALSE, @"Unable to serialize JSON from NSDict to NSData"); } else { NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; request.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON]; }

La clave para mí fue el ''MIMEType: RKMIMETypeJSON'' en la última línea. Como solo quería usar RKRequest, así era como necesitaba configurar el tipo MIME. De lo contrario, usaría la sugerencia de Paul Cézanne.


Para mayores RestKit

Probablemente tengas algo como esto en tu delegado:

objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded;

Quieres que sea

objectManager.serializationMIMEType = RKMIMETypeJSON;

Para RestKit v.20:

// thanks ColdLogic (from his comment) [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];