使用未映射到POST对象的RestKit处理POST响应

Die*_*ros 9 objective-c ios restkit restkit-0.20

我有一个情况,我正在做一个对象的帖子(不是托管的,只是一个NSObject派生的),但REST API的响应不是被发布的对象类型的JSON表示.这完全是另一回事.有可能处理这个吗?

假设我发布了一个对象(JSON):

{
  "prop1" : 123,
  "prop2" : 5
}
Run Code Online (Sandbox Code Playgroud)

并且响应如果不是具有属性的对象,prop1并且prop2正如默认情况下RestKit所期望的那样,而是其他内容:

{
  "data" : [1,2,3,4,5,6],
  "message" : "hello world"
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了将operation.targetObject设置为nil的示例,但(我相信)这只是在Core Data托管方案中.

我正在尝试这样简单的事情:

RKObjectRequestOperation *operation = [self.objectManager appropriateObjectRequestOperationWithObject:body method:RKRequestMethodPOST path:@"items" parameters:nil];

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) {
   // success is called, but the result does not contain what the response JSON is
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
  // failure
}];

[operation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) {
    // deserializedResponseBody is always nil
}];

[operation start];
Run Code Online (Sandbox Code Playgroud)

我以为我能够查看setWillMapDeserializedResponseBlock中的响应内容,但它总是为零.

由于发布对象有prop1prop2性能,以及RestKit是如何工作的默认情况下,预计JSON与所述属性.但是,由于结果与发布的对象无关,prop1并且prop2只是零(我无论如何都不关心).

顺便说一句,我已经正确设置了请求映射,因此body传入操作对象正确映射我的NSObject并将其以正确的JSON格式发送到服务器.

有没有办法让我可以用RestKit进行这样的调用,并在成功事件中手动拉出我要找的东西?即使它是JSON响应的字典表示?

Jon*_*kas 16

我只是为您的响应创建一个新对象,并将您的响应映​​射到该响应.

对象

@interface MYRequest : NSObject

@property NSNumber *prop1;
@property NSNumber *prop2;

@end

@interface MYResponse : NSObject

@property NSArray *data;
@property NSString *message;

@end
Run Code Online (Sandbox Code Playgroud)

映射

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
[requestMapping addAttributeMappingsFromArray:@[@"prop1", @"prop2"]];

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[MYResponse class]];
[requestMapping addAttributeMappingsFromArray:@[@"data", @"message"]];
Run Code Online (Sandbox Code Playgroud)

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping
                                                                               objectClass:[MYRequest class]
                                                                               rootKeyPath:nil
                                                                                    method:RKRequestMethodPOST];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
                                                                                        method:RKRequestMethodPOST
                                                                                   pathPattern:@"items"
                                                                                       keyPath:nil
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
Run Code Online (Sandbox Code Playgroud)

对象管理器

[self.objectManager addRequestDescriptor:requestDescriptor];
[self.objectManager addResponseDescriptor:responseDescriptor];
Run Code Online (Sandbox Code Playgroud)

执行

MYRequest *body = [MYRequest new];
[body setProp1:@123];
[body setProp2:@5];

[self.objectManager postObject:body
                          path:@"items"
                    parameters:nil
                       success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                           MYResponse *result = [mappingResult firstObject];
                           NSLog(@"Data: %@\nMessage: %@", [result data], [result message]);
                       }
                       failure:^(RKObjectRequestOperation *operation, NSError *error) {
                           NSLog(@"Error: %@", error);
                       }];
Run Code Online (Sandbox Code Playgroud)