我的服务器有以下JSON ......
{"Devices": [
{
"uuid": "d9084134-d5f7-43a3-9613-7faa769a822a",
"label": "",
"location": "a13d45f4-5ce0-48e3-bc3f-4076bb007037",
"capability": 0
},
{
"uuid": "a4ee0d3f-4a6a-4c61-81bd-3dfa9ab19e85",
"label": "",
"location": "a13d45f4-5ce0-48e3-bc3f-4076bb007037",
"capability": 3
}
]}
我正在尝试正确地映射这个但我正在努力...我有以下映射设置...
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Device" inManagedObjectStore:managedObjectStore];
[entityMapping setIdentificationAttributes:[NSArray arrayWithObject:@"uuid"]];
[entityMapping addAttributeMappingsFromDictionary:@{
@"uuid": @"uuid",
@"label": @"label",
@"location": @"location",
@"capability": @"capability"
}];
// GET
RKRequestDescriptor *getRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[entityMapping inverseMapping] objectClass:[Device class] rootKeyPath:@"Device" method:RKRequestMethodGET];
[[RKObjectManager sharedManager] addRequestDescriptor:getRequestDescriptor];
[[RKObjectManager sharedManager].router.routeSet addRoute:[RKRoute routeWithClass:[Device class] pathPattern:@"Devices" method:RKRequestMethodGET]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:@"Devices" keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];
我将keyPath设置为“设备”,我认为这些设备可以正常工作。但是RestKit并没有理解它。
我正在使用以下内容从我的服务器获取对象...
[[RKObjectManager sharedManager] getObjectsAtPath:@"Devices" parameters:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d", clientID], @"clientId", @"topic", @"forTopic", nil] success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
...
}... // Abbreviated for brevity.
所以我相信我的路径“Devices”对于“Devices”的pathPattern是正确的。这些参数搞砸了吗?我以前有过参数,而且无需在映射中指定任何内容,它始终有效。
我目前正在使用RestKit 0.27.1。
更新 - 修正了JSON
我修改了Mahendra GP提到的JSON。所以现在这是一个合适的数组。 RestKit日志现在显示跟踪日志中的JSON。但是它仍然无法识别它是哪个对象(设备)。
日志片段......
...and targetObject: (null)
2018-03-09 02:44:05.603734-0700 MyTestApp[31576:6868006] D restkit.object_mapping:RKMapperOperation.m:440 Finished performing object mapping. Results: (null)
2018-03-09 02:44:05.605334-0700 MyTestApp[31576:6868006] E restkit.network:RKObjectRequestOperation.m:172 GET 'http://[MY_IP]:8080/Devices?clientId=5199&forTopic=topic' (200 OK / 0 objects) [request=2.6488s mapping=0.0000s total=2.6633s]: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No response descriptors match the response loaded."
答案 0 :(得分:0)
我终于通过fluke试错找出了我的问题。我无法在RestKit的网站上找到任何关于SO或以上的特定帖子。因此,我想我会在这里发布解决问题的简单解决方案。
我不断收到错误,我的任何响应描述符都没有与任何关键路径匹配。我认为这与我传递给GET的参数有关,因为它会在错误中尝试将其与设置响应描述符的设备路径进行比较。然而事实证明这根本不是问题。
问题在于我的RKResponseDescriptor设置。我本来有......
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:@"Devices" keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
此处的解决方案是" pathPattern "。这需要设置为 nil 。
我已经使用RestKit多年了。在0.2x版本发布之前。我记得有些事情是关于RestKit能够识别一个实体,而它只是通过多元化来实现它的多重性。我终于想到,也许是因为我在pathPattern中指定它导致了这个问题。所以,一旦我最终确定它为零,它终于开始工作了。我实际上认为原因是将它设置为nil就像将它设置为任何pathPattern的通配符,因为我的路径实际上已经将参数标记到它们上面。
然而在另一个用例中,我确实指定了pathPattern,但它不是映射实体的复数,而是它的不同之处。所以我没有使用DeviceForUser这样的设备。因此,在pathPattern中指定实体的复数时似乎存在问题。特别是如果在getObjectsAtPath调用中使用参数。
为清楚起见,上面的所有代码都是相同的。它只需要这种改变......
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:nil keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
我希望这可以帮助其他可能遇到此问题的人。