9

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

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

{
  "prop1" : 123,
  "prop2" : 5
}

并且响应如果不是具有属性的对象prop1prop2,正如RestKit默认期望的那样,但还有其他东西:

{
  "data" : [1,2,3,4,5,6],
  "message" : "hello world"
}

我已经看到 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];

我以为我可以查看 setWillMapDeserializedResponseBlock 中的响应内容,但它始终为零。

因为发布的对象具有prop1prop2属性,以及默认情况下 RestKit 是如何工作的,所以它需要带有所述属性的 JSON。但是,由于结果与发布的对象无关,prop1并且prop2只是 nil (无论如何我都不关心)。

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

有没有一种方法可以让我使用 RestKit 进行这样的调用,并手动提取我在成功事件中寻找的内容?即使它是 JSON 响应的字典表示形式?

4

3 回答 3

16

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

对象

@interface MYRequest : NSObject

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

@end

@interface MYResponse : NSObject

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

@end

映射

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

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[MYResponse class]];
[requestMapping addAttributeMappingsFromArray:@[@"data", @"message"]];

描述符

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)];

对象管理器

[self.objectManager addRequestDescriptor:requestDescriptor];
[self.objectManager addResponseDescriptor:responseDescriptor];

执行

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);
                       }];
于 2013-08-16T16:18:52.387 回答
1

您可以将源对象转换为字典并发送它。然后响应数据自然会映射到字典中。这应该是对映射的最小更改和对其他代码的小更改(使用 KVC dictionaryWithValuesForKeys:)。

于 2013-08-16T09:43:24.560 回答
0
Simply used below code

//If we received error message dictionary in API then we can convert RKObjectRequestOperation Data into Json dictionary 

 if let json = try JSONSerialization.jsonObject(with: operation.httpRequestOperation.responseData, options: .mutableContainers) as? [String: Any] {
//here we can catch our error message..
let message:String = json["ErrorMessage"] as! String?
 print("Error Message: \(message)")
}
于 2017-03-24T07:31:20.747 回答