Я нахожусь в процессе создания 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
следует рассматривать как родительский.Ответы:
Уровень 3 REST API будет возвращать вам ,
Foo
а также ссылку , указывающую связанными с этимBar
.Затем вы можете добавить функцию «детализации» в свой API, которая позволяет перемещаться по ссылкам;
Функция детализации располагается перед API и перехватывает ответы. Он будет выполнять детализацию вызовов и заполнять детали, прежде чем передать ответ вызывающей стороне.
Это довольно распространенная вещь в REST уровня 3, так как она значительно снижает общение между клиентом и сервером по медленному http. Компания, в которой я работаю, производит API REST уровня 3 именно с этой функцией.
Обновление: для чего оно стоит, вот как это может выглядеть в JSON. Вот как наш API будет структурировать это. Обратите внимание, что вы можете вкладывать детализацию в ссылки и т. Д.
источник
links
массив, каждый элемент представляет собой объект ссылки сrel
иuri
поле (аналогично вашим пример XML). Должен ли я просто добавить третье поле для каждого объекта ссылки (напримерdata
)? Есть ли какой-нибудь стандарт?Если 95% всех запросов хотят
Foo
, а такжеBar
, то просто вернуть его внутрь отFoo
объекта , когда вы запрашиваетеFoo
. Просто добавьте свойствоbar
(или другой термин для отношения) и поместитеBar
объект туда. Если отношения не существуют, используйте нуль.Я думаю, что вы думаете об этом :)
источник
Foo
, и поскольку каждый из нихBar
имеет достаточно большой объем памяти (примерно в 3–4 раза большеFoo
), я не хочу возвращать,Bar
если клиент не запрашивает его явно.