Я нахожусь в процессе создания 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. Однако, как я уже писал выше, возможно, что множественные Foos имеют одинаковые значения Bar. Должно быть возможно создать Fooбез Barсвязанного, поэтому я не думаю, что Barследует рассматривать как родительский.