Я зараз розробляю API REST, і наразі у мене виникає така проблема:
Foo
є першим ресурсом. Операції CRUD можна застосувати через/foo/
URI.Bar
є другим ресурсом. Операції CRUD можна застосувати через/bar/
URI.- Кожен
Foo
асоціюється з нулем або однимBar
. Причина, по якій я неBar
ставлюсь до субресурсу,Foo
полягає в тому, що один і той жеBar
екземпляр може бути спільним між mutipleFoo
s. Тому я зрозумів, що краще отримати доступ до нього через незалежний 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
. Однак, як я писав вище, цілком можливо, що множини Foo
s поділяють одне і те ж Bar
. Слід створити Foo
без Bar
асоційованого, тому я не думаю, що до цього Bar
слід ставитися як до батьківського.