Le R dans REST est synonyme de ressource
(Ce qui n'est pas vrai, car il signifie représentationnel, mais c'est une bonne astuce pour se souvenir de l'importance des ressources dans REST).
À propos PUT /groups/api/v1/groups/{group id}/status/activate
: vous ne mettez pas à jour un "activer". Un "activer" n'est pas une chose, c'est un verbe. Les verbes ne sont jamais de bonnes ressources. Une règle d'or: si l'action, un verbe, est dans l'URL, elle n'est probablement pas RESTful .
Que fais-tu à la place? Soit vous "ajoutez", "supprimez" ou "mettez à jour" une activation sur un groupe, soit si vous préférez: manipuler une ressource "état" sur un groupe. Personnellement, j'utiliserais des «activations» car elles sont moins ambiguës que le concept de «statut»: la création d'un statut est ambiguë, la création d'une activation ne l'est pas.
POST /groups/{group id}/activation
Crée (ou demande la création de) une activation.
PATCH /groups/{group id}/activation
Met à jour certains détails d'une activation existante. Puisqu'un groupe n'a qu'une seule activation, nous savons à quelle ressource d'activation nous faisons référence.
PUT /groups/{group id}/activation
Insère ou remplace l'ancienne activation. Puisqu'un groupe n'a qu'une seule activation, nous savons à quelle ressource d'activation nous faisons référence.
DELETE /groups/{group id}/activation
Annulera ou supprimera l'activation.
Ce modèle est utile lorsque «l'activation» d'un groupe a des effets secondaires, tels que des paiements en cours, des courriers envoyés, etc. Seuls POST et PATCH peuvent avoir de tels effets secondaires. Lorsque, par exemple, la suppression d'une activation doit, par exemple, avertir les utilisateurs par courrier électronique, SUPPRIMER n'est pas le bon choix; dans ce cas , vous voulez probablement créer une ressource de désactivation : POST /groups/{group_id}/deactivation
.
C'est une bonne idée de suivre ces directives, car ce contrat standard indique très clairement pour vos clients, et toutes les procurations et couches entre le client et vous, sachez quand il est sûr de réessayer et quand ce n'est pas le cas. Disons que le client est quelque part avec un wifi floconneux, et son utilisateur clique sur "désactiver", ce qui déclenche un DELETE
: Si cela échoue, le client peut simplement réessayer, jusqu'à ce qu'il obtienne un 404, 200 ou tout autre chose qu'il peut gérer. Mais s'il déclenche un POST to deactivation
il sait ne pas réessayer: le POST l'implique.
Tout client a maintenant un contrat qui, une fois suivi, protégera contre l'envoi de 42 e-mails "votre groupe a été désactivé", tout simplement parce que sa bibliothèque HTTP a continué de relancer l'appel vers le backend.
Mise à jour d'un seul attribut: utilisez PATCH
PATCH /groups/{group id}
Si vous souhaitez mettre à jour un attribut. Par exemple, le "statut" pourrait être un attribut sur les groupes qui peut être défini. Un attribut tel que "status" est souvent un bon candidat pour se limiter à une liste blanche de valeurs. Les exemples utilisent un schéma JSON non défini:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
Remplacer la ressource, sans effets secondaires, utilisez PUT.
PUT /groups/{group id}
Si vous souhaitez remplacer un groupe entier. Cela ne signifie pas nécessairement que le serveur crée réellement un nouveau groupe et rejette l'ancien, par exemple les identifiants peuvent rester les mêmes. Mais pour les clients, c'est ce que PUT peut signifier: le client doit supposer qu'il obtient un élément entièrement nouveau, basé sur la réponse du serveur.
En cas de PUT
demande, le client doit toujours envoyer l'intégralité de la ressource, avec toutes les données nécessaires à la création d'un nouvel élément: généralement les mêmes données que celles nécessaires à une création 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.
Une exigence très importante PUT
est idempotente: si vous avez besoin d'effets secondaires lors de la mise à jour d'un groupe (ou de la modification d'une activation), vous devez l'utiliser PATCH
. Donc, lorsque la mise à jour se traduit par exemple par l'envoi d'un mail, ne l'utilisez pas PUT
.