Обновление RESTful API для членов группы

#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 для данной группы.