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é)?
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.
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é).
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: