使用 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的主要内容,如果未能解决你的问题,请参考以下文章