2012-02-01 10 views
18

Jestem nowy w rozwoju iOS i mam problem z wykonaniem prostego żądania JON POST. Mam NSDictionary zawierający użytkownika i hasło i chcę wysłać te wartości jako Json do serwera i uzyskać odpowiedź. Miałem to działające bez używania pakietu restkit, ale nie mogę wymyślić, jak osiągnąć to samo używając narzędzia RestKit i po prostu nie mogę znaleźć dobrego przykładu tego, czego chcę.Wykonaj prosty test POST przy użyciu programu 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; 
} 

Serwer oczekuje JSON tak:

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

Rozumiem, że istnieje parser Json obejmują w RestKit ale nie mogę znaleźć żadnej dokumentacji na temat sposobu analizowania mojego słownika rpcData, czy muszę korzystać z biblioteki zewnętrznej ?.

W tej chwili komunikacja z serwerem jest w porządku, ale nie wysyłam tego, co jest oczekiwane. Mój słownik jest odwzorowany w sposób "key = value? Key2 = value2 ...". To bardzo głupie pytanie, ale utknąłem.

Aktualizacja

Kiedy to pisałem, to działało ale Restkit został zaktualizowany, więc nie jestem pewien, czy to będzie działać, sprawdź ich dokumentację

Oto rozwiązanie na mój problem, to co robię jest idealne do pracy z API RPC, kiedy musisz zadzwonić do usługi:

1.- Najpierw w twoim obiekcie musisz zaimportować Restkit i RKRequestSerialization, to jest bardzo ważne:

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

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate> 

2.- Oto funkcja logowania wysyłając wiadomość:

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

Nie jest jasne, jaki jest problem. Czy dane nie są wysyłane? Nie otrzymałeś? Jak wyglądają twoje nagłówki zapytań i odpowiedzi? Rozważ skorzystanie z http://www.charlesproxy.com/ w celu uzyskania pomocy. Nie zapomnij również zaznaczyć zielonego znacznika wyboru obok najlepszej odpowiedzi na poprzednie pytania. Otrzymasz więcej odpowiedzi w ten sposób. –

+0

W sposób w jaki mój kod jest, nie wysyłam żądania JSON.Mam to jasne, serwer uzyskuje dane takie jak "? Jsonrpc = '2.0' & method = 'authenticate' ..." Muszę wiedzieć, jak przeanalizować to w JSON – clopez

+0

Możesz sprawdzić żądanie wysłane przez Restkit, aktywując dziennik debugowania za pośrednictwem tego wiersza w kodzie 'RKLogConfigureByName (" RestKit/Network ", RKLogLevelTrace);' – redDragonzz

Odpowiedz

9

miałem ten sam problem, i to rozwiązać go dla mnie. Uwaga: w moim scenariuszu chciałem tylko uzyskać dostęp do 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]; 
} 

Kluczem dla mnie był "MIMEType: RKMIMETypeJSON" w ostatnim wierszu. Ponieważ chciałem tylko użyć RKRequest, tak właśnie musiałem ustawić typ MIME. W przeciwnym razie użyłbym sugestii Paula Cezanne'a.

+0

To jest to samo, co już wprowadziłem do aktualizacji mojego pytania, ale jest OK: P – clopez

24

dla starszych RestKit

Prawdopodobnie masz coś takiego w swoim delegatem:

objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded; 

Chcesz, aby było:

objectManager.serializationMIMEType = RKMIMETypeJSON; 

Dla RestKit V.20:

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

Nie pracuję z Object Managerem, myślę, że Twoja sugestia działa podczas mapowania obiektu. Tak nie jest, ale myślę, że rozwiązałem mój problem. Opublikuję assap rozwiązania. Dziękuję Paul !. – clopez

+0

ah tak, widzę to teraz. Cieszę się, że to rozwiązałeś! –

+12

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

Powiązane problemy