【发布时间】: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 或任何转换。
标签: objective-c json cocoa-touch post restkit