Я зараз розробляю API REST, і наразі у мене виникає така проблема:
Fooє першим ресурсом. Операції CRUD можна застосувати через/foo/URI.Barє другим ресурсом. Операції CRUD можна застосувати через/bar/URI.- Кожен
Fooасоціюється з нулем або однимBar. Причина, по якій я неBarставлюсь до субресурсу,Fooполягає в тому, що один і той жеBarекземпляр може бути спільним між mutipleFoos. Тому я зрозумів, що краще отримати доступ до нього через незалежний URI, а не через/foo/[id]/bar.
Моя проблема полягає в тому, що у значній кількості випадків клієнти, які запитують про Fooекземпляр, також зацікавлені в асоційованому Barекземплярі. В даний час це означає, що вони повинні виконувати два запити замість одного. Я хочу представити спосіб, який дозволяє отримувати обидва об'єкти одним запитом, але я не знаю, як моделювати API для цього. Що я придумав поки що:
- Я міг би ввести параметр запиту , схожий на цей:
/foo/[id]?include_bar=true. Проблема такого підходу полягає в тому, що представлення ресурсів (наприклад, структура JSON) відповіді повинно виглядати інакше (наприклад, контейнер, такий як{ foo: ..., bar: ... }просто серіалізованийFoo), що робитьFooкінцеву точку ресурсу "неоднорідною". Я не думаю, що це добре. Під час запитів/fooклієнти повинні завжди отримувати однакове представлення ресурсів (структуру), незалежно від параметрів запиту. - Інша ідея полягає у запровадженні нової кінцевої точки лише для читання, наприклад
/fooandbar/[foo-id]. У цьому випадку повернути таке представлення не проблема{ foo: ..., bar: ... }, адже тоді це лише "офіційне" представленняfooandbarресурсу. Однак я не знаю, чи така кінцева точка-помічник справді ВІДПОВІДНА (саме тому я написав "можна" у назві питання. Звичайно, це технічно можливо, але я не знаю, чи це гарна ідея).
Як ти гадаєш? Чи є інші можливості?
Barможе існувати без асоціації з a Foo. Однак, як я писав вище, цілком можливо, що множини Foos поділяють одне і те ж Bar. Слід створити Fooбез Barасоційованого, тому я не думаю, що до цього Barслід ставитися як до батьківського.