#rest #http #restful-url
#rest #http #restful-url
Вопрос:
У меня есть два ресурса: Group
и Item
. Каждый из них Item
принадлежит определенному Group
и имеет status
поле. Я хочу иметь возможность обновлять статус для каждого из Item
в Group
inactive
в в одном вызове API. Это единственное изменение статуса, которое я хочу — я не хочу менять его на active
или что-то в этом роде.
Какой есть RESTful способ сделать это? Я знаю, что наличие глаголов в URL-адресе не одобряется, поэтому /api/groups/<group_id>/deactivate-items
было бы нехорошо. Будет ли PATCH /api/groups/<group_id>/items
с полезной нагрузкой status='inactive'
уместно в REST?
Ответ №1:
Какой есть RESTful способ сделать это?
Подумайте о том, как бы вы сделали это с веб-сайтом.
Вы, вероятно, получили бы какую-то страницу, описывающую группу; где-то на этой странице была бы какая-то семантическая подсказка, говорящая «чтобы сделать всех членов группы неактивными, отправьте эту форму. Если форма была отправлена, то ваш серверный сервер будет отвечать за выполнение фактической работы, и вы отправите обратно страницу с описанием того, что только что произошло, со ссылками на другие интересные вещи, которые нужно сделать.
Поскольку браузеры понимают HTTP и HTML, все это может быть сделано с использованием любых идентификаторов, которые предоставляет сервер. Сервер может свободно изменять действие формы, потому что браузер просто выполняет обработку формы, как описано в стандарте HTML, и использует целевой uri, описанный метаданными формы.
Поскольку идентификатором может быть что угодно, вы можете воспользоваться интересным свойством — небезопасные методы запроса (включая PUT, POST, DELETE) аннулируют локально кэшированные ресурсы в случае успеха. Таким образом, одной интересной возможностью было бы отправить данные формы обратно в /api/groups/<group_id>
и аннулировать все предыдущие копии этой страницы.
Подойдет ли ИСПРАВЛЕНИЕ /api/groups/<group_id>/items с полезной нагрузкой status=’неактивный’ в REST?
Может быть — это зависит от того, что /api/groups/<group_id>/items
есть.
Ключевой момент, о котором следует помнить при использовании REST, заключается в том, что ваша модель ресурсов — это не ваша модель домена, а не ваша модель данных. Ресурсы поддерживают протоколы, которые мы хотим предоставить клиенту.
Подробную форму этого см. в докладе Джима Уэббера 2011.
Комментарии:
1. Спасибо за продуманный ответ и ссылку. Мне придется немного понаблюдать за этим. С точки зрения кэширования и т.д. Я ничего этого не делаю —
Items
,Groups
и все их атрибуты хранятся в базе данных. Я еще не настроил конечные точки, но я думал о том, чтобы/api/groups/<group_id>/items
вернуть списокItems
для данной группы.