在RestKit中,RK如何对对象列表以及单个对象进行GET的最佳方法是什么?

时间:2013-07-29 04:22:42

标签: restkit restkit-0.20

大多数RESTful API会路由访问资源,例如Rabbit对象,如下所示:

GET  /rabbits                    <--- GET all rabbits. HTTP GET
GET  /rabbits/:rabbit_id         <--- GET one rabbit. Also HTTP GET
POST /rabbits
PUT  /rabbit/:rabbit_id

但是,RestKit不允许我有两个具有相同HTTP动词的路由,因此无法将两个GET路由添加到RKObjectManager的RouteSet:

[manager.router.routeSet addRoute:[RKRoute routeWithClass:[Rabbit class]
                                              pathPattern:@"rabbits"
                                                   method:RKRequestMethodGET]];

[manager.router.routeSet addRoute:[RKRoute routeWithClass:[Rabbit class]
                                              pathPattern:@"rabbits/:rabbitID"
                                                   method:RKRequestMethodGET]];

//BOOM! Assertion failure

这导致断言失败:“无法添加与现有路线具有相同类别和方法的路线。”

为什么我不能添加具有相同类和方法的路由? 路径不同。我怎么能得到兔子的列表以及ID的单个兔子?我知道几种解决方法,但我觉得这不是我应该解决的问题。

3 个答案:

答案 0 :(得分:6)

如果您使用命名路线,则可以执行此操作。您不能使用非命名路由,因为它会产生一个RestKit应该使用的歧义。

答案 1 :(得分:3)

对象类路线设计用于实例。执行GET时会使用getObject:someObject path:nil parameters:nil success:nil failure:nil路线。

集合加载通常通过命名路由或路径完成。

答案 2 :(得分:0)

如果它可以帮助任何人使用代码,那么下面是如何使用名称设置路径。

// When you are setting up your mapping, set up Route with Name.
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                                        method:RKRequestMethodGET
                                                                                   pathPattern:LOGIN_URL
                                                                                       keyPath:nil
                                                                                   statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager].router.routeSet addRoute:[RKRoute routeWithName:LOGIN_ROUTE pathPattern:LOGIN_URL method:RKRequestMethodGET]];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];


// And when you are ready to make the http call, do the following
[[RKObjectManager sharedManager] getObjectsAtPathForRouteNamed:LOGIN_ROUTE
                                                    object:userProfile
                                                parameters:params
                                                   success:success
                                                   failure:failure];