Сделайте простой json POST с помощью RESTKit
Я новичок в разработке 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 : '[email protected]',
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];
}
}
Ответы
Ответ 1
У меня была такая же проблема, и это то, что решило ее для меня. Обратите внимание, что в моем сценарии я только хотел получить доступ к 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. В противном случае я бы использовал предложение Пола Сезанна.
Ответ 2
Для старого RestKit
У вас, вероятно, есть что-то подобное в вашем делетете:
objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded;
Вы хотите, чтобы это было:
objectManager.serializationMIMEType = RKMIMETypeJSON;
Для RestKit v.20:
// thanks ColdLogic (from his comment)
[objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];