В RestKit, как лучше всего RKRoute получить список объектов, а также один объект?

Большинство 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 в RouteSet RKObjectManager:

[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

Это вызывает ошибку утверждения: "Невозможно добавить маршрут с тем же классом и методом, что и у существующего маршрута".

Почему я не могу добавить маршрут с тем же классом и методом? путь отличается. Как я должен получить как список кроликов, так и одного кролика по идентификатору? Я знаю несколько обходных путей, но я чувствую, что это не то, что мне нужно обходить.


person Eric Goldberg    schedule 29.07.2013    source источник


Ответы (3)


Если вы используете именованные маршруты, вы можете это сделать. Вы не можете использовать неименованные маршруты, потому что это создает двусмысленность, которую должен использовать один RestKit.

person Wain    schedule 29.07.2013
comment
Однако похоже, что getObjectsAtPath: и getObject:path: должны позаботиться об этом. Я предполагаю, что у вас может быть путь, например, objects/:id, ссылающийся на набор нескольких объектов, но это кажется не RESTful. - person Eric Goldberg; 30.07.2013

Маршруты классов объектов предназначены для работы с экземплярами. В частности, маршрут GET используется при выполнении getObject:someObject path:nil parameters:nil success:nil failure:nil.

Загрузка коллекции обычно выполняется через именованные маршруты или пути.

person Blake Watters    schedule 03.08.2013
comment
в случае сообщения, как я могу использовать RKRoute - person Yadnesh; 19.05.2014

Если это поможет кому-то с кодом, вот как настроить маршрут с именем.

// 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];
person hackerinheels    schedule 10.04.2014