R в REST обозначает ресурс
(Что неверно, потому что это означает «Репрезентативный», но это хороший трюк, чтобы помнить о важности ресурсов в REST).
О себе PUT /groups/api/v1/groups/{group id}/status/activate
: вы не обновляете "активировать". «Активировать» - это не вещь, это глагол. Глаголы никогда не бывают хорошими ресурсами. Практическое правило: если действие, глагол, находится в URL-адресе, вероятно, это не RESTful .
Что ты делаешь вместо этого? Либо вы «добавляете», «удаляете» или «обновляете» активацию в группе, либо, если вы предпочитаете: манипулируете «статусом» -ресурса в группе. Лично я бы использовал «активации», потому что они менее двусмысленны, чем понятие «статус»: создание статуса неоднозначно, создание активации - нет.
POST /groups/{group id}/activation
Создает (или запрашивает создание) активацию.
PATCH /groups/{group id}/activation
Обновляет некоторые детали существующей активации. Поскольку в группе только одна активация, мы знаем, о каком ресурсе активации идет речь.
PUT /groups/{group id}/activation
Вставляет или заменяет старую активацию. Поскольку в группе только одна активация, мы знаем, о каком ресурсе активации идет речь.
DELETE /groups/{group id}/activation
Отменит или удалит активацию.
Этот шаблон полезен, когда «активация» группы имеет побочные эффекты, такие как выполнение платежей, отправка писем и так далее. Только POST и PATCH могут иметь такие побочные эффекты. Когда, например, для удаления активации необходимо, например, уведомить пользователей по почте, УДАЛИТЬ - не правильный выбор; в этом случае вы , вероятно , хотите создать деактивацию ресурс : POST /groups/{group_id}/deactivation
.
Это хорошая идея - следовать этим рекомендациям, потому что этот стандартный контракт очень ясно дает вашим клиентам, а все прокси и уровни между клиентом и вами знают, когда можно безопасно повторить попытку, а когда нет. Предположим, что клиент находится где-то с нестабильным Wi-Fi, и его пользователь нажимает «деактивировать», что вызывает DELETE
: Если это не удается, клиент может просто повторить попытку, пока не получит 404, 200 или что-то еще, с чем он сможет справиться. Но если он запускает, POST to deactivation
он знает, что повторять попытку нельзя: это подразумевает POST.
Теперь у любого клиента есть контракт, при соблюдении которого он будет защищать от отправки 42 электронных писем «ваша группа отключена» просто потому, что его HTTP-библиотека продолжала повторять вызовы на бэкэнд.
Обновление одного атрибута: используйте PATCH
PATCH /groups/{group id}
Если вы хотите обновить атрибут. Например, «статус» может быть атрибутом в группах, который можно установить. Такой атрибут, как «статус», часто является хорошим кандидатом для ограничения белого списка значений. В примерах используется некоторая неопределенная JSON-схема:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
При замене ресурса без побочных эффектов используйте PUT.
PUT /groups/{group id}
Если вы хотите заменить всю группу. Это не обязательно означает, что сервер фактически создает новую группу и выбрасывает старую, например, идентификаторы могут остаться прежними. Но для клиентов это может означать PUT : клиент должен предполагать, что он получает совершенно новый элемент, основываясь на ответе сервера.
В случае PUT
запроса клиент должен всегда отправлять весь ресурс, имея все данные, необходимые для создания нового элемента: обычно те же данные, что и для POST-create.
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
Очень важным требованием является PUT
идемпотентность: если вам требуются побочные эффекты при обновлении группы (или изменении активации), вы должны использовать PATCH
. Поэтому, когда в результате обновления, например, отправляется электронное письмо, не используйте PUT
.