我是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字典的任何文档,我是否需要使用外部库?
现在与服务器的通信还可以,但是我没有发送期望的消息。我的字典的映射方式为“键=值?键2 =值2 …”。这是一个很愚蠢的问题,但我被困住了。
更新资料
在我撰写本文时,它已经可以使用,但是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]; } }
我遇到了同样的问题,这就是为我解决的问题。注意,在我的场景中,我只想访问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类型的方式。否则,我会使用保罗塞尚的建议。