Do a simple json POST using RESTKit

核能气质少年 提交于 2019-12-17 18:28:52

问题


I'm new to iOS development and I'm having trouble making a simple Json POST request. I have a NSDictionary containing an user and password and I want to send those values as a Json to a server and get a response. I had that working without using restkit but I can't figure out how to accomplish the same using RestKit and just can't find a good example of what I want.

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

The server is expecting a Json like this:

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

I understand that there is a Json parser include in RestKit but I can't find any documentation on how to parse my rpcData dictionary, do I need to use an external library?.

Right now the communication with the server it's ok, but I'm not sending what is expected. My dictionary is mapped in the way "key=value?key2=value2...". This is very silly question but I'm stucked.

Update

By the time I wrote this, it worked but Restkit has been updated so I'm not sure if this will work, please check their documentation

Here is the solution to my problem, what I'm doing is ideal for working with RPC APIs when you need to call a service:

1.- First in your object you need to import Restkit and RKRequestSerialization, this is very important:

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

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate>

2.- Here is the login function sending the 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];
    }
}

回答1:


I had the same problem, and this is what solved it for me. Note, in my scenario, I only wanted to access 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];
}

The key for me was the 'MIMEType:RKMIMETypeJSON' in the last line. Since I only wanted to use RKRequest, this was how I needed to set the MIME type. Otherwise, I would use Paul Cezanne's suggestion.




回答2:


For older RestKit

You probably have something like this in your delegate:

    objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded;

You want it to be:

    objectManager.serializationMIMEType = RKMIMETypeJSON;

For RestKit v.20:

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


来源:https://stackoverflow.com/questions/9102262/do-a-simple-json-post-using-restkit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!