Я хочу спроектировать свою конечную точку отдыха с помощью подходящего метода для следующего сценария.
Есть группа. У каждой группы есть статус. Группа может быть активирована или деактивирована администратором.
Должен ли я спроектировать свою конечную точку как
PUT /groups/api/v1/groups/{group id}/status/activate
ИЛИ
PATCH /groups/api/v1/groups/{group id}
with request body like
{action:activate|deactivate}
http
rest
http-put
http-method
http-patch
java_geek
источник
источник
activate
" не является адекватной конструкцией RESTful. Вероятно, вы пытаетесьstatus
изменить значение на «активный» или «неактивный». в этом случае вы можете выполнить ПАТЧ.../status
с "активной" или "деактивной" строкой в теле. Или, если вы пытаетесь обновить логическое значение вstatus.active
, вы можете выполнить ПАТЧ.../status/active
с логическим значением в телеОтветы:
Этот
PATCH
метод является правильным выбором, поскольку вы обновляете существующий ресурс - идентификатор группы.PUT
следует использовать только в том случае, если вы полностью заменяете ресурс.Дополнительная информация о частичной модификации ресурсов доступна в RFC 5789 . В частности,
PUT
метод описывается следующим образом:источник
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-схема:
При замене ресурса без побочных эффектов используйте PUT.
PUT /groups/{group id}
Если вы хотите заменить всю группу. Это не обязательно означает, что сервер фактически создает новую группу и выбрасывает старую, например, идентификаторы могут остаться прежними. Но для клиентов это может означать PUT : клиент должен предполагать, что он получает совершенно новый элемент, основываясь на ответе сервера.
В случае
PUT
запроса клиент должен всегда отправлять весь ресурс, имея все данные, необходимые для создания нового элемента: обычно те же данные, что и для POST-create.Очень важным требованием является
PUT
идемпотентность: если вам требуются побочные эффекты при обновлении группы (или изменении активации), вы должны использоватьPATCH
. Поэтому, когда в результате обновления, например, отправляется электронное письмо, не используйтеPUT
.источник
Я бы рекомендовал использовать PATCH, потому что ваша группа ресурсов имеет много свойств, но в этом случае вы обновляете только поле активации (частичное изменение)
согласно RFC5789 ( https://tools.ietf.org/html/rfc5789 )
Также, более подробно,
Код ответа для PATCH:
также см. http://restcookbook.com/HTTP%20Methods/patch/
источник
Поскольку вы хотите разработать API с использованием архитектурного стиля REST, вам необходимо подумать о своих сценариях использования, чтобы решить, какие концепции достаточно важны для использования в качестве ресурсов. Если вы решите раскрыть статус группы в качестве подресурса, вы можете дать ей следующий URI и реализовать поддержку методов GET и PUT:
Обратной стороной этого подхода по сравнению с PATCH для модификации является то, что вы не сможете вносить изменения более чем в одно свойство группы атомарно и транзакционно. Если транзакционные изменения важны, используйте PATCH.
Если вы решите раскрыть статус как подресурс группы, это должна быть ссылка в представлении группы. Например, если агент получает группу 123 и принимает XML, тело ответа может содержать:
Гиперссылка необходима для выполнения гипермедиа в качестве движка состояния приложения в архитектурном стиле REST.
источник
Я бы предпочел что-то попроще, например
activate
/deactivate
sub-resource (связанныйLink
заголовком сrel=service
).или
Для потребителя этот интерфейс предельно прост и следует принципам REST, не отвлекая вас от концептуализации «активаций» как отдельных ресурсов.
источник
Один из возможных вариантов реализации такого поведения:
И, очевидно, если кому-то нужно его деактивировать, он
PUT
будет иметьDeactivated
статус в JSON.В случае необходимости массовой активации / деактивации,
PATCH
может перейти в игру (не для конкретной группы, а дляgroups
ресурса:В общем, это идея, как предлагает @Andrew Dobrowolski, но с небольшими изменениями в точной реализации.
источник