2012-02-01 14 views
18

Soy nuevo en el desarrollo de iOS y tengo problemas para hacer una simple solicitud de JSON POST. Tengo un NSDictionary que contiene un usuario y una contraseña y deseo enviar esos valores como un Json a un servidor y obtener una respuesta. Lo hice funcionar sin usar el kit de recuperación, pero no puedo encontrar la manera de lograrlo utilizando RestKit y simplemente no puedo encontrar un buen ejemplo de lo que quiero.Haz un POST simple de json usando RESTKit

- (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 esto:

{ 
    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 incluyen 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 está mapeado de la forma "clave = valor? Clave2 = valor2 ...". Esta es una pregunta muy tonta pero estoy sorprendido.

actualización

En el momento de escribir este, funcionó pero Restkit se ha actualizado así que no estoy seguro de si esto va a funcionar, compruebe su documentación

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

1.- en primer lugar, en el objeto que necesita importar Restkit y RKRequestSerialization, esto es muy importante:

#import <RestKit/RestKit.h> 
#import <RestKit/RKRequestSerialization.h> 

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate> 

2.- Aquí es la función de inicio de sesión de enviar el mensaje:

- (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]; 
    } 
} 
+0

No está claro cuál es el problema. ¿No se están enviando los datos? No ser recibido? ¿Cómo son tus encabezados de solicitud y respuesta? Considere usar http://www.charlesproxy.com/ para ayudar. Y también, no olvide marcar la marca verde al lado de la mejor respuesta para sus preguntas anteriores. Obtendrás más respuestas de esa manera. –

+0

En la forma en que mi código es, no estoy enviando una solicitud JSON.Lo tengo claro, el servidor está obteniendo datos como "? Jsonrpc = '2.0' & method = 'authenticate' ..." Necesito saber cómo analizar eso en un JSON – clopez

+0

Puede verificar la solicitud enviada por Restkit activando el depurar el registro a través de esta línea en el código 'RKLogConfigureByName (" RestKit/Network ", RKLogLevelTrace);' – redDragonzz

Respuesta

9

que tenían el mismo problema, y ​​esto es lo resuelto por mí. 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 tenía que establecer el tipo MIME. De lo contrario, usaría la sugerencia de Paul Cezanne.

+0

Esto es lo mismo que ya puse en la actualización de mi pregunta, creo, pero está bien: P – clopez

24

Para mayor RestKit

Es probable que tenga algo como esto en su delegado:

objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded; 

Quiere que sea:

objectManager.serializationMIMEType = RKMIMETypeJSON; 

Para v.20 RestKit:

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

No estoy trabajando con Object Manager, creo que su sugerencia funciona cuando mapea un objeto. Este no es el caso, pero creo que resolví mi problema. Publicaré la solución assap. Gracias Paul !. – clopez

+0

ah sí, ya lo veo. Me alegra que lo hayas resuelto! –

+12

para restkit v.20: '[objectManager setRequestSerializationMIMEType: RKMIMETypeJSON];' – ColdLogic