使用 RESTKit 做一个简单的 json POST

Posted

技术标签:

【中文标题】使用 RESTKit 做一个简单的 json POST【英文标题】:Do a simple json POST using RESTKit 【发布时间】:2012-02-01 19:49:27 【问题描述】:

我是 ios 开发的新手,在发出简单的 Json POST 请求时遇到了麻烦。 我有一个包含用户和密码的 NSDictionary,我想将这些值作为 Json 发送到服务器并获得响应。我在不使用 restkit 的情况下也能做到这一点,但我不知道如何使用 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;

服务器期待这样的 Json:


    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

我知道 RestKit 中有一个 Json 解析器,但我找不到任何关于如何解析我的 rpcData 字典的文档,我需要使用外部库吗?。

现在与服务器的通信正常,但我没有发送预期的内容。我的字典以“key=value?key2=value2...”的方式映射。这是一个非常愚蠢的问题,但我被困住了。

更新

到我写这篇文章的时候,它已经工作了,但是 Restkit 已经更新了,所以我不确定这是否能工作,请查看他们的文档

这是我的问题的解决方案,当您需要调用服务时,我正在做的是使用 RPC API 的理想选择:

1.- 首先在你的对象中你需要导入 Restkit 和 RKRequestSerialization,这很重要:

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

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate>

2.- 这是发送帖子的登录功能:

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

【问题讨论】:

不清楚问题出在哪里。数据没有发送吗?没有收到?您的请求和响应标头是什么样的?考虑使用charlesproxy.com 来提供帮助。此外,不要忘记检查您之前问题的最佳答案旁边的绿色复选标记。这样你会得到更多的回复。 按照我的代码方式,我没有发送 JSON 请求。我很清楚,服务器正在获取类似“?jsonrpc='2.0'&method='authenticate'...”的数据,我需要知道如何将其解析为JSON 您可以通过代码RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);中的这一行激活调试日志来检查Restkit发送的请求 每次你想发出 POST 请求时,你是否也必须做 RKParserRegistry 的事情? 仅当您需要将某些字典解析为某些东西(在我的情况下为 JSON)时才需要。使用 Restkit 后,我​​建议对这种请求使用对象映射,这样更干净,因为在映射对象时会进行 JSON 或任何转换。 【参考方案1】:

适用于旧版 RestKit

你的委托中可能有这样的东西:

    objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded;

你希望它是:

    objectManager.serializationMIMEType = RKMIMETypeJSON;

对于 RestKit v.20:

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

【讨论】:

我没有使用对象管理器,我认为您的建议在映射对象时有效。情况并非如此,但我认为我解决了我的问题。我会尽快发布解决方案。谢谢保罗!。 restkit v.20:[objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];【参考方案2】:

我遇到了同样的问题,这就是为我解决的问题。请注意,在我的场景中,我只想访问 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];

对我来说,关键是最后一行中的“MIMEType:RKMIMETypeJSON”。因为我只想使用 RKRequest,所以我需要设置 MIME 类型。否则,我会使用保罗塞尚的建议。

【讨论】:

我认为这与我已经提出的问题更新相同,但没关系:P

以上是关于使用 RESTKit 做一个简单的 json POST的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 相同对象上的一对一映射,除了

RestKit 简单的 JSON,错误的 pathPAttern?

Restkit 路由错误

RestKit 在 RKEntityMapping 行崩溃

JSON 对象映射 - RestKit

Post Json Restkit 无法为 HTTP 方法“POST”类型的对象找到可路由路径