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 можуть мати такі побічні ефекти. Якщо, наприклад, про видалення активації потрібно, скажімо, повідомляти користувачів поштою, DELETE не є правильним вибором; в цьому випадку ви , ймовірно , хочете створити деактивацію ресурс : 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-створення.
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
.