Я нахожусь в процессе создания REST API и в настоящее время сталкиваюсь со следующей проблемой:
Foo
это первый ресурс. Операции CRUD могут применяться через/foo/
URI.Bar
это второй ресурс. Операции CRUD могут применяться через/bar/
URI.- Каждый
Foo
связан с нулем или единицейBar
. Причина, по которой я не рассматриваю себяBar
как подресурс,Foo
заключается в том, что один и тот жеBar
экземпляр может использоваться несколькими объектамиFoo
. Поэтому я решил, что лучше получить к нему доступ через независимый URI, а не/foo/[id]/bar
.
Моя проблема в том, что в значительном количестве случаев клиенты, которые запрашивают Foo
экземпляр, также заинтересованы в связанном Bar
экземпляре. В настоящее время это означает, что они должны выполнить два запроса вместо одного. Я хочу представить способ, который позволяет получать оба объекта одним запросом, но я не знаю, как смоделировать API для этого. Что я придумал до сих пор:
- Я мог бы ввести параметр запроса , похожий на этот:
/foo/[id]?include_bar=true
. Проблема этого подхода заключается в том, что представление ресурса (например, структура JSON) ответа должно выглядеть иначе (например, контейнер, например,{ foo: ..., bar: ... }
вместо сериализацииFoo
), что делаетFoo
конечную точку ресурса «неоднородной». Я не думаю, что это хорошо. При запросе/foo
клиенты всегда должны получать одинаковое представление ресурса (структуру) независимо от параметров запроса. - Другая идея состоит в том, чтобы ввести новую конечную точку только для чтения, например
/fooandbar/[foo-id]
. В этом случае нет проблем с возвращением представления типа{ foo: ..., bar: ... }
, потому что тогда это просто «официальное» представлениеfooandbar
ресурса. Тем не менее, я не знаю, является ли такая вспомогательная конечная точка действительно RESTful (вот почему я написал «can» в заголовке вопроса. Конечно, это технически возможно, но я не знаю, хорошая ли это идея).
Что вы думаете? Есть ли другие возможности?
Bar
не может существовать без связи с Foo
. Однако, как я уже писал выше, возможно, что множественные Foo
s имеют одинаковые значения Bar
. Должно быть возможно создать Foo
без Bar
связанного, поэтому я не думаю, что Bar
следует рассматривать как родительский.