gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:08 24 4
gpt4 key购买 nike

我有一种情况,我正在发布一个对象(不是托管对象,只是一个 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中的响应内容,但它总是nil。

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

顺便说一下,我已经正确地设置了请求映射,所以在操作对象中传递的 body 正确地映射了我的 NSObject 并以正确的 JSON 格式将它发送到服务器。

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

最佳答案

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

对象

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

关于ios - 使用未映射到 POST 对象的 RestKit 处理 POST 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com