Каков RESTful способ реализации запроса GET, который позволяет фильтровать потенциально сотни идентификаторов ресурсов? - PullRequest
0 голосов
/ 04 августа 2020

Допустим, я разрабатываю API рецептов, и он предоставляет доступ к ресурсам рецептов, состоящим из ингредиентов, инструкций и, конечно же, длинной предыстории рецепта):

GET /recipes/   - returns a paginated list of recipes

Теперь, скажем, меня попросили реализовать функцию, позволяющую пользователю запрашивать рецепты, которые они еще не пробовали. Один из возможных запросов для этого может быть:

GET /recipes?tried=false

Поскольку служба, которая управляет рецептами, скорее всего, отличается от службы, которая управляет рецептами, которые видел пользователь, этот маршрут звучит как неправильный подход.

Возможно, улучшение будет следующим:

GET /user/{user_id}/recipes?tried=false

Это говорит о том, что эта пользовательская служба могла бы получить список всех рецептов, которые пользователь пробовал, а затем отправить запрос в службу рецептов для возврата разбитого на страницы списка. рецептов, за исключением тех, которые пользователь уже пробовал.

Но это означает, что будет такой маршрут:

GET /recipes?exclude=202,203,420,109,...,400

, и это может превышать максимальную длину для URL-адресов.

Есть ли способ RESTful для поддержки этих функций, не подвергая риску слишком длинные URL-адреса?

Я подумал о создании нового ресурса, называемого фильтром, который позволил бы вызывающей стороне создать фильтр с помощью POST, который включает список идентификаторов рецептов, которые пробовал пользователь, и передачи URL или идентификатора этого фильтра в t он рецепт службы, а затем удаление ресурса фильтра, но это начало звучать слишком сложно.

Заранее спасибо!

1 Ответ

1 голос
/ 04 августа 2020

Для меня это больше похоже на вопрос об обмене стеком программной инженерии, но я все равно постараюсь дать ответ.

На мой взгляд, нет правильного или неправильного способа сделать это, но вы можете уйти так: пользователь / фронт запрашивает URL-адрес рецепта с параметром запроса unseen. Служба, стоящая за этим, получает список рецептов, которые пользователь уже видел, из службы, которая имеет эту информацию. Теперь у вас есть два варианта: получить список всех рецептов и отбросить просмотренные вручную или иметь конечную точку POST на бэкэнде рецептов, где база данных может обрабатывать задание, взяв список рецептов в кодировке JSON / xml для фильтрации вых.

...