我在当前的项目中使用 RestKit 来促进与定制的 REST API 的通信。我在从索引终结点检索资源集合时遇到问题。我能够检索资源,但是我无法将它们映射到目标类。
以下是详细信息(我已经用小部件替换了有问题的实际业务对象)。
端点是 GET/api/v1/widgets 。从终结点返回的 JSON 如下所示:
{"widgets": [
{
"widgets": {
"name": "whatsit",
"material": "wood",
"crafted_by": "Hrunkner"
}
},
{
"widgets": {
"name": "doodad",
"material": "carbon fiber",
"crafted_by": "Zaphod"
}
}
]}
我知道上述 JSON 结构对于每个资源的根节点名称是特殊的,但这目前超出了我的控制范围。
我在 WidgetManager 类中使用以下代码来执行请求:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
// apiBaseURL equals @"http://localhost:3000/api/v1/"
NSURL *apiBaseURL = [NSURL URLWithString:appDelegate.apiBaseURL];
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:apiBaseURL];
NSString *itemsPath = @"widgets";
NSString *keyPath = @"widgets.widgets";
NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
RKObjectMapping *requestMapping = [[Widget widgetMapping] inverseMapping];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping: requestMapping
objectClass:[Widget class]
rootKeyPath:keyPath
method:RKRequestMethodGET];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:requestMapping
method:RKRequestMethodGET
pathPattern:nil
keyPath:keyPath
statusCodes:statusCodeSet];
[manager addRequestDescriptor: requestDescriptor];
[manager addResponseDescriptor:responseDescriptor];
[manager getObjectsAtPath:@"widgets"
parameters:@{}
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
[appDelegate setWidgets:[mappingResult array]];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"FAIL");
}];
我的 [小部件映射] 方法如下所示:
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Widget class]];
[mapping addAttributeMappingsFromDictionary:@{
@"name": @"name",
@"material": @"material",
@"crafted_by": @"craftedBy"
}];
return mapping;
在我看来,使用反向映射是问题所在,但是当我尝试使用 [Widget widgetMapping] 而不是 [[Widget widgetMapping] inverseMapping] 作为请求映射时,我收到以下错误
RKRequestDescriptor 对象必须使用其映射进行初始化,该映射 目标类是 NSMutableDictionary,得到了 Widget(参见 [RKObjectMapping requestMapping])
我在这里做错了什么?我应该如何正确配置我的请求以将每个返回的对象映射到 Widget 类?
对于我的问题中的任何遗漏或错误,感谢并道歉。
事实证明,仅对响应描述符使用反向映射允许对象映射成功进行。以前,我尝试对请求和响应描述符使用相同的映射,这将不起作用。因此,将分配给requestMapping更改为简单的[Widget requestmapping]
,然后将[requestMapping inverseMapping]
传递给请求描述符init解决了我的问题。当然,这将需要重命名局部变量requestMapping
,因为它实际上对请求描述符没有用。
以下问题的答案为澄清请求与响应描述符中的映射功能提供了正确的方向:https://stackoverflow.com/a/23217042/757806