web-dev-qa-db-fra.com

REST DELETE est-il vraiment idempotent?

DELETE est censé être idempotent.

Si je supprime http://example.com/account/12 cela va supprimer le compte.

Si je le refais, est-ce que j'attendrais un 404, puisque le compte n'existe plus? Que faire si j'essaye de SUPPRIMER un compte qui n'a jamais existé?

146
Ben Noland

L'idempotence fait référence à l'état du système une fois la demande terminée


Dans tous les cas (à l'exception des problèmes d'erreur - voir ci-dessous), le compte n'existe plus.

De ici

"Les méthodes peuvent également avoir la propriété" idempotence "en ce que ( en dehors des problèmes d'erreur ou d'expiration ) les effets secondaires de N> 0 requêtes identiques sont comme pour une seule demande. Les méthodes GET, HEAD, PUT et DELETE partagent cette propriété. De plus, les méthodes OPTIONS et TRACE NE DEVRAIENT PAS avoir d'effets secondaires et sont donc intrinsèquement idempotentes. "


Le bit clé est le les effets secondaires de N> 0 demandes identiques sont les mêmes que pour une seule demande.

Vous auriez raison de vous attendre à ce que le code d'état soit différent, mais cela n'affecte pas le concept de base d'idempotency - vous pouvez envoyer la demande plusieurs fois sans modifications supplémentaires de l'état du serveur.

173
Chris McCauley

Idempotent concerne l'effet de la demande, pas le code de réponse que vous obtenez.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 dit:

Les méthodes peuvent également avoir la propriété "idempotence" en ce que (à part les problèmes d'erreur ou d'expiration) les effets secondaires de N> 0 requêtes identiques sont les mêmes que pour une seule requête.

Bien que vous puissiez obtenir un code de réponse différent, l'effet de l'envoi de N + 1 demandes DELETE à la même ressource peut être considéré comme le même.

41
Bruno

À partir de HTTP RFC :

Les méthodes peuvent également avoir la propriété "idempotence" en ce que (à part les problèmes d'erreur ou d'expiration) les effets secondaires de N> 0 requêtes identiques sont les mêmes que pour une seule requête.

Notez que ce sont des "effets secondaires", pas une "réponse".

7
fumanchu

La distinction importante est que idempotent fait référence à effets secondaires, et non à tous - les effets ou les réponses. Si vous faites un DELETE http://example.com/account/123 alors l'effet est que le compte 123 est maintenant supprimé du serveur. C'est le seul et unique effet, le seul et unique changement à l'état du serveur. Disons maintenant que vous faites de même DELETE http://example.com/account/123 demande à nouveau, le serveur répondra différemment, mais son état est le même.

Ce n'est pas comme si la demande DELETE avait décidé de changer l'état du serveur d'une manière différente car le compte était manquant, comme la suppression d'un autre compte ou la fermeture d'un journal d'erreurs. Non, vous pouvez appeler la même requête DELETE un million de fois et vous pouvez être sûr que le serveur est dans le même état que lors de votre premier appel.

6
Janac Meena

Oui. Quel que soit le code de réponse.

De dernier RFC pour HTTP 1.1 (accent sur le mien):

Les méthodes idempotentes sont distinguées car la demande peut être répétée automatiquement si une défaillance de communication se produit avant que le client ne puisse lire la réponse du serveur. Par exemple, si un client envoie une demande PUT et que la connexion sous-jacente est fermée avant toute réponse, le client peut établir une nouvelle connexion et réessayer la demande idempotente. Il sait que la répétition de la demande aura le même effet prévu, même si la demande d'origine a réussi, bien que la réponse puisse différer.

Il dit explicitement que la réponse pourrait différer. Plus important encore, il souligne la raison du concept: si une action est idempotente, le client peut répéter l'action lorsqu'il rencontre une erreur et sait qu'il ne plantera rien en le faisant; sinon, le client devra effectuer une requête supplémentaire (éventuellement GET) pour voir si la précédente est efficace, avant de répéter l'action en toute sécurité. Tant que le serveur peut fournir une telle garantie, l'action est idempotente. Citation de n autre commentaire :

Le calcul de l'idempotence concerne la robustesse d'un système. Étant donné que les choses peuvent échouer (par exemple, une panne de réseau), lorsqu'une défaillance est détectée, comment récupérez-vous? La récupération la plus simple consiste à recommencer, mais cela ne fonctionne que si la répétition est idempotente. Par exemple. discard(x) est idempotent, mais pop() ne l'est pas. C'est une question de récupération d'erreur.

3
Franklin Yu

Je pense que la même chose, 404 - Le compte n'existe pas.

Vous pourriez argumenter 400 - Bad Request. Mais dans le sens de REST l'objet sur lequel vous avez demandé d'effectuer une action n'existe pas. Cela se traduit par 404.

2
Jason McCreary