RestKit ios - поставить - json вместо закодированной формы - PullRequest
13 голосов
/ 16 марта 2011

Я пишу приложение ios, которое использует restkit для связи с веб-сервером через Rest with JSON

Я могу использовать [[RKObjectManager sharedManager] loadObjectsAtResourcePath: делегат пути: self], чтобы получить объект из моего веб-сервиса как JSON, отобразить его на объект obj-c, он отлично работает

сейчас я пытаюсь использовать: [[RKObjectManager sharedManager] putObject: obj Delegate: self]; и этот вызов отправляет объект в веб-службу как закодированную форму, а не JSON

поэтому мой вопрос: как настроить sharedManager (или routeur?) Для отправки с типом содержимого JSON вместо закодированной формы.

любой пример кода высоко ценится.

Thx!

Ответы [ 5 ]

9 голосов
/ 12 августа 2011

Самый простой способ - просто установить свойство при инициализации менеджера объектов, например так:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://url.com"];
objectManager.serializationMIMEType = RKMIMETypeJSON;
3 голосов
/ 25 апреля 2012

Эван прав, но я должен был также убедиться, что посылаю строку JSON, потому что у меня был вложенный NSDictionay.

Если у вас есть словарь, который вы хотите отправить в виде строки JSON, вот как вы можете это сделать:

// create a JSON string from your NSDictionary
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                                                   options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                     error:&error];
NSString *jsonString = [[NSString alloc] init];
if (!jsonData) {
    NSLog(@"Got an error: %@", error);
} else {
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

// make the post using the objectManager if you want to map the response to a model
RKObjectManager* objectManager = [RKObjectManager sharedManager];  
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) {
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]];
    loader.resourcePath = @"/api/";
    loader.method = RKRequestMethodPOST;
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON];
}];
1 голос
/ 15 октября 2013

Создание диспетчера объектов и установка свойства для соответствия заголовка в формате JSON

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://mobile.com"]];
[objectManager addResponseDescriptorsFromArray:@[responseDescriptor]];

objectManager.requestSerializationMIMEType = RKMIMETypeJSON;
1 голос
/ 16 марта 2011

Хорошо, только что нашел, как это сделать:

подкласс RKRouter.h или просто изменить в RKDynamicRouter.m

return [object propertiesForSerialization];

на

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]];

и генерировать RestKitJSON для вызова putObject

0 голосов
/ 10 октября 2013

Вы можете изменить serializationMIMEType для отдельных запросов путем создания подкласса RKObjectManager и изменить реализацию requestWithObject: method: path: параметры: в менеджере подклассов.

Отправить запрос:

SubclassedObjectManager *manager = ...
[manager putObject:nil
           path:pathString
     parameters:parameters
        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
      } failure:^(RKObjectRequestOperation *operation, NSError *error) {
      }
 ];

Изменить MIMEType типазапрос метода PUT:

- (NSMutableURLRequest *)requestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path parameters:(NSDictionary *)parameters
{
  NSMutableURLRequest *request = [super requestWithObject:object method:method path:path parameters:parameters];
  if (method&RKRequestMethodPUT) {
    NSError *error = nil;
    NSData *serializedJSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
    [request setValue:RKMIMETypeJSON forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:serializedJSON];
  }

  return request;
}
...