2012-02-01 15 views
18

Sono nuovo nello sviluppo di iOS e ho difficoltà a effettuare una semplice richiesta JSON POST. Ho un NSDictionary contenente un utente e una password e voglio inviare quei valori come Json a un server e ottenere una risposta. L'ho fatto funzionare senza usare il restkit ma non riesco a capire come ottenere lo stesso usando RestKit e non riesco a trovare un buon esempio di ciò che voglio.Esegui un semplice POST utilizzando 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; 
} 

Il server è in attesa di un JSON come questo:

{ 
    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 
} 

ho capito che c'è un parser JSON includono in RestKit ma non riesco a trovare alcuna documentazione su come analizzare il mio dizionario rpcData, devo usare una libreria esterna?

In questo momento la comunicazione con il server è ok, ma non invio quello che ci si aspetta. Il mio dizionario è mappato come "chiave = valore? Key2 = valore2 ...". Questa è una domanda molto sciocca, ma sono bloccato.

Aggiornamento

Con il tempo ho scritto questo, ha funzionato ma Restkit è stato aggiornato in modo non sono sicuro se questo funzionerà, si prega di controllare la loro documentazione

Ecco la soluzione per il mio problema, quello che sto facendo è ideale per lavorare con le API RPC quando è necessario chiamare un servizio:

1.- Prima nell'oggetto è necessario importare Restkit e RKRequestSerialization, questo è molto importante:

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

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate> 

2.- Ecco la funzione di login di invio del post:

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

Non è chiaro quale sia il problema. I dati non vengono inviati? Non viene ricevuto? Che aspetto hanno le intestazioni di richiesta e risposta? Considerare l'utilizzo di http://www.charlesproxy.com/ per aiutare. Inoltre, non dimenticare di selezionare il segno di spunta verde accanto alla risposta migliore per le tue domande precedenti. Riceverai più risposte in questo modo. –

+0

Nel modo in cui è il mio codice, non sto inviando una richiesta JSON.Ho chiaro, il server sta ricevendo dati come "? Jsonrpc = '2.0' & method = 'authenticate' ..." Ho bisogno di sapere come analizzarlo in un JSON – clopez

+0

Puoi controllare la richiesta inviata da Restkit attivando il log di debug tramite questa riga nel codice 'RKLogConfigureByName (" RestKit/Network ", RKLogLevelTrace);' – redDragonzz

risposta

9

Ho avuto lo stesso problema, e questo è ciò che ha risolto per me. Nota, nel mio scenario, volevo solo accedere 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 chiave per me era la 'MIMEType: RKMIMETypeJSON' nell'ultima riga. Dato che volevo solo usare RKRequest, questo era il modo in cui avevo bisogno di impostare il tipo MIME. Altrimenti, userei il suggerimento di Paul Cezanne.

+0

Questo è lo stesso che ho già inserito nell'aggiornamento delle domande, penso, ma va bene: P – clopez

24

Per le versioni precedenti RestKit

Probabilmente avete qualcosa di simile nel tuo delegato:

objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded; 

Vuoi che sia:

objectManager.serializationMIMEType = RKMIMETypeJSON; 

Per RestKit V.20:

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

Non sto lavorando con Object Manager, penso che il tuo suggerimento funzioni quando mappi un oggetto. Questo non è il caso, ma penso di aver risolto il mio problema. Pubblicherò la soluzione assap. Grazie Paolo !. – clopez

+0

ah sì, lo vedo ora. Sono contento che tu l'abbia risolto! –

+12

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

Problemi correlati