2

大多数 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 同时获取 Rabbit 列表和单个 Rabbit?我知道几种解决方法,但我觉得这不是我应该解决的问题。

4

3 回答 3

6

如果您使用命名路线,您可以做到这一点。您不能使用未命名的路由,因为它会产生一个 RestKit 应该使用的歧义。

于 2013-07-29T19:15:17.080 回答
3

对象类路由旨在与实例一起使用。GET特别是在你执行时使用的路线getObject:someObject path:nil parameters:nil success:nil failure:nil

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

于 2013-08-03T04:14:50.727 回答
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];
于 2014-04-10T18:21:22.580 回答