La R in REST sta per risorsa
(Il che non è vero, perché rappresenta la rappresentazione, ma è un buon trucco per ricordare l'importanza delle risorse in REST).
A proposito PUT /groups/api/v1/groups/{group id}/status/activate
: si sta non aggiornando una "Attiva". Un "attivare" non è una cosa, è un verbo. I verbi non sono mai buone risorse. Una regola empirica: se l'azione, un verbo, è nell'URL, probabilmente non è RESTful .
Cosa stai facendo invece? O stai "aggiungendo", "rimuovendo" o "aggiornando" un'attivazione su un gruppo, o se preferisci: manipolare una risorsa "status" su un gruppo. Personalmente, userei le "attivazioni" perché sono meno ambigue del concetto "status": la creazione di uno stato è ambigua, la creazione di un'attivazione non lo è.
POST /groups/{group id}/activation
Crea (o richiede la creazione di) un'attivazione.
PATCH /groups/{group id}/activation
Aggiorna alcuni dettagli di un'attivazione esistente. Poiché un gruppo ha una sola attivazione, sappiamo a quale risorsa di attivazione ci stiamo riferendo.
PUT /groups/{group id}/activation
Inserisce o sostituisce la vecchia attivazione. Poiché un gruppo ha una sola attivazione, sappiamo a quale risorsa di attivazione ci stiamo riferendo.
DELETE /groups/{group id}/activation
Annullerà o rimuoverà l'attivazione.
Questo modello è utile quando l '"attivazione" di un gruppo ha effetti collaterali, come pagamenti effettuati, posta inviata e così via. Solo POST e PATCH possono avere tali effetti collaterali. Quando, ad esempio, una cancellazione di un'attivazione deve, per esempio, informare gli utenti via mail, DELETE non è la scelta giusta; in questo caso probabilmente si desidera creare una risorsa di disattivazione : POST /groups/{group_id}/deactivation
.
È una buona idea seguire queste linee guida, perché questo contratto standard lo rende molto chiaro per i tuoi clienti e tutti i proxy e i livelli tra il cliente e te, sapere quando è sicuro riprovare e quando no. Diciamo che il client è da qualche parte con il wifi instabile e il suo utente fa clic su "Disattiva", che attiva un DELETE
: Se ciò fallisce, il client può semplicemente riprovare, fino a quando non ottiene un 404, 200 o qualsiasi altra cosa che possa gestire. Ma se innesca un POST to deactivation
non sa riprovare: il POST lo implica.
Ogni client ora ha un contratto, che, se seguito, proteggerà dall'invio di 42 e-mail "il tuo gruppo è stato disattivato", semplicemente perché la sua libreria HTTP ha continuato a riprovare la chiamata al back-end.
Aggiornamento di un singolo attributo: usa PATCH
PATCH /groups/{group id}
Nel caso in cui desideri aggiornare un attributo. Ad esempio, lo "stato" potrebbe essere un attributo sui gruppi che può essere impostato. Un attributo come "status" è spesso un buon candidato per limitare a una whitelist di valori. Gli esempi usano alcuni schemi JSON non definiti:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
Sostituendo la risorsa, senza effetti collaterali usa PUT.
PUT /groups/{group id}
Nel caso in cui desideri sostituire un intero gruppo. Ciò non significa necessariamente che il server crei effettivamente un nuovo gruppo e ne elimini uno vecchio, ad esempio gli ID potrebbero rimanere gli stessi. Ma per i client, questo è ciò che PUT può significare: il client dovrebbe presumere che ottiene un elemento completamente nuovo, basato sulla risposta del server.
Il client dovrebbe, in caso di una PUT
richiesta, inviare sempre l'intera risorsa, avendo tutti i dati necessari per creare un nuovo elemento: normalmente gli stessi dati richiesti da una creazione 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.
Un requisito molto importante è quello PUT
idempotente: se si richiedono effetti collaterali durante l'aggiornamento di un gruppo (o la modifica di un'attivazione), è necessario utilizzare PATCH
. Pertanto, quando l'aggiornamento comporta, ad esempio, l'invio di una e-mail, non utilizzare PUT
.