RestKit ios - put - json вместо формы, закодированной

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

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

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

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

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

спасибо!

Ответ 1

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

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://url.com"];
objectManager.serializationMIMEType = RKMIMETypeJSON;

Ответ 2

Эван прав, но мне также нужно было убедиться, что я отправляю строку 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];
}];

Ответ 3

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

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

return [object propertiesForSerialization];

к

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]];

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

Ответ 4

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

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

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

Изменить MIMET тип запроса для метода 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;
}

Ответ 5

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

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

objectManager.requestSerializationMIMEType = RKMIMETypeJSON;