web-dev-qa-db-fra.com

Suppression d'une ressource à l'aide de http DELETE

Donc, étant donné que le verbe DELETE dans Http est idempotent, que dois-je faire lors de la demande suivante?

DELETE /person/123

La première fois, la ressource est supprimée et je renvoie un 204 (réussi, aucun contenu). Devrais-je renvoyer un 204 lors d'appels suivants ou un 404 (non trouvé)?

103
Craig Wilson

Comme les requêtes HTTP dans un système sans état doivent être indépendantes, les résultats d'une requête ne doivent pas dépendre d'une requête précédente. Réfléchissez à ce qui devrait se passer si deux utilisateurs effectuent simultanément une opération DELETE sur la même ressource. Il est logique que la deuxième demande obtienne un 404. Il en va de même si un utilisateur fait deux demandes.

J'imagine que le fait de supprimer deux réponses différentes avec DELETE ne vous semble pas idempotent. Je trouve utile de penser aux demandes idempotentes que de laisser le système dans le même état, sans nécessairement avoir la même réponse. Ainsi, que vous effaciez une ressource existante ou tentiez de supprimer une ressource inexistante, l'état des ressources du serveur est identique.

129
Darrel Miller

Le livre de recettes des services Web RESTful est une excellente ressource à cet égard. Par hasard, son aperçu Google affiche la page sur DELETE (page 11):

La méthode DELETE est idempotente. Cela implique que le serveur doit renvoyer le code de réponse 200 (OK) même si le serveur a supprimé la ressource dans une requête précédente. Mais dans la pratique, pour implémenter DELETE en tant qu’opération idempotente, le serveur doit garder une trace de toutes les ressources supprimées. Sinon, il peut renvoyer un 404 (non trouvé).

28
yves amsellem

First DELETE: 200 ou 204.

Suppression ultérieure: 200 ou 204.

Reason: DELETE devrait être idempotent. Si vous renvoyez 404 lors d'une seconde suppression, votre réponse passe d'un code de réussite à un code d'erreur. Le programme client peut effectuer des actions incorrectes en supposant que la suppression a échoué.

Exemple:

  • Supposons que votre opération DELETE fasse partie d'une opération en plusieurs étapes (ou une "saga") exécutée par le programme client.
  • Le programme client peut être une application mobile effectuant une transaction bancaire, par exemple.
  • Supposons que le programme client effectue une nouvelle tentative automatique pour une opération DELETE (cela a du sens, car DELETE est supposé être idempotent).
  • Supposons que la première opération DELETE a été exécutée avec succès, mais la réponse 200 s'est perdue lors de son acheminement vers le programme client.
  • Le programme client va réessayer le DELETE.
  • Si la deuxième tentative renvoie 404, le programme client peut annuler l'opération globale en raison de ce code d'erreur.
  • Mais parce que le premier DELETE a été exécuté avec succès sur le serveur, le système peut rester dans un état incohérent.
  • Si la deuxième tentative renvoie 200 ou 204, le programme client se déroulera comme prévu.
10
Paulo Merson