2013-12-04 1 views
1

Я делаю запрос POST с вложенным JSON в его теле HTTP, и я не получаю соответствующий ответ. Я передаю пользовательский объект под названием RequestObject со свойствами:Запрос на привязку объекта RestKit, который имеет вложенный JSON в свой HTTP-объект

@interface RequestObject : NSObject 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, strong) NSDictionary *location; 
@property (nonatomic, strong) NSMutableArray *pictures; 

Я хочу, чтобы отобразить свой объект таким образом, что в HTTP Body, то JSON будет выглядеть следующим образом:

{ 
     "title": "Magic School Bus", 
     "location": { 
      "latitude": "38.764792", 
      "longitude": "-121.247574" 
     }, 
     "pictures": [ 
      { 
       "base64pic": "iVBORw0KGg..." 
      } 
     ] 
} 

Для объекта запроса, Я настроил его так:

RequestObject *request = [[RequestObject alloc] init]; 

// Title property 
request.title = @"MyTitle"; 

// Location property 
request.location = @{ 
       @"latitude" : [NSNumber numberWithDouble:38.757965], 
       @"longitude" : [NSNumber numberWithDouble:-121.254044] 
       }; 

// Pictures property 
request.pictures = [[NSMutableArray alloc] init]; 

// I add a dictionary into the pictures array 
NSDictionary *picture = @{@"base64pic" : @"somebase64string"}; 
[request.pictures addObject:picture]; 

Я считаю, что может быть установлен в моих request.pictures неправильно, и именно поэтому мой ответ возвращается неправильно. Это остаток моего кода для вызова запроса POST:

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; 
[mapping addAttributeMappingsFromArray:@[@"title", @"location", @"pictures"]]; 
[manager addRequestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RequestObject class] rootKeyPath:nil method:RKRequestMethodPOST]]; 

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[NSDictionary class]]; 
[mapping addAttributeMappingsFromArray:@[@"response"]]; 
[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodPOST pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

// Post 
[manager postObject:request path:@"books/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result){ 

    // Response back 
}failure:^(RKObjectRequestOperation *operation, NSError *error) { 

Когда я делаю вызов POST в моем проекте, я вижу это как тело HTTP запроса в моей консоли:

Request Body : location[latitude]=38.757965&location[longitude]=-121.254044&pictures[][base64pic]=somebase64string&title=MyTitle 
+0

Почему бы вам просто не создать NSMutableURLRequest и setHTTPBody с вашими данными запроса и создать RKObjectRequestOperation с этим запросом. Это может сделать вещи проще и понятнее. – execv

+0

Я хотел бы использовать возможности отображения RestKit и узнать, как решить эту проблему, чтобы я мог применить это к моим другим запросам. – kevnguy

+0

@ Ad-J Я последовал вашим советам и смог успешно запросить запрос. Я закончил делать это «вручную» через NSMutableURLRequest, и я установил тело HTTP с NSDictionary. Я хотел бы иметь возможность использовать пользовательский объект для установки моих значений, а затем преобразовать объект в NSData, чтобы я мог передать его в тело HTTP запроса. Есть ли способ взять объект, сопоставить его с RestKit и затем вернуть объект NSData из отображения? – kevnguy

ответ

0

Ваш код выглядит нормально. Проблема заключается в том, что вы не устанавливаете тип сериализации запроса в JSON, чтобы получить форму URL, закодированную в теле.

+0

Хмм я установил свой менеджер так: 'manager.requestSerializationMIMEType = RKMIMETypeJSON;' и я все еще не получаю правильный ответ. – kevnguy

+0

Изменился ли запрос? Вы проверяли запрос с Чарльзом? Вы включили отслеживание трассировки для отображения? – Wain

0

Вы можете просто создать NSMutableURLRequest и установитьHTTPBody с вашими данными запроса и создать RKObjectRequestOperation с этим запросом. Это может сделать вещи проще и понятнее.

Для следующего вопроса: Не все объекты являются действительными объектами JSOn, и вы можете передавать только действительные объекты JSON с телом запроса, иначе серверная сторона, возможно, не сможет его расшифровать (серверная сторона не будет знать ваш пользовательский объект).

Смежные вопросы