DELETE est censé être idempotent.
Si JE SUPPRIME http://example.com/account/123, cela supprimera le compte.
Si je le refais, est-ce que je m'attendrais à un 404, puisque le compte n'existe plus? Que faire si j'essaye de SUPPRIMER un compte qui n'a jamais existé?
http
rest
http-headers
Ben Noland
la source
la source
Réponses:
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.
D' ici
Le bit clé là est les effets secondaires de N> 0 demandes identiques est le même 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 de l'idempotence - vous pouvez envoyer la demande plus d'une fois sans modifications supplémentaires de l'état du serveur.
la source
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:
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.
la source
La distinction importante est que idempotent fait référence aux effets secondaires , et non à tous les effets ou réponses. Si vous faites une,
DELETE http://example.com/account/123
l'effet est que le compte 123 est maintenant supprimé du serveur. C'est le seul et unique effet, le seul et unique changement de l'état du serveur. Maintenant, disons que vous faites à nouveau la mêmeDELETE http://example.com/account/123
demande, le serveur répondra différemment, mais son état est le même.Ce n'est pas comme si la demande DELETE a 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 suppression d'un journal des 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 la première fois que vous l'avez appelé .
la source
À partir du RFC HTTP :
Notez que ce sont des "effets secondaires" et non une "réponse".
la source
Oui. Quel que soit le code de réponse.
De la dernière RFC pour HTTP 1.1 (c'est moi qui souligne):
Il dit explicitement que la réponse pourrait différer. Plus important encore, il indique la raison du concept: si une action est idempotente, le client peut répéter l'action quand il rencontre une erreur, et sait qu'il ne plantera rien en le faisant; sinon, le client devra faire 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 faire une telle garantie, l'action est idempotente. Citation d' un autre commentaire :la source
Je pense la même chose, 404 - Le compte n'existe pas.
Vous pourriez argumenter 400 - Mauvaise demande. 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.
la source
Cité de mon autre réponse ici :
Historiquement, la RFC 2616, publiée en 1999, était la spécification HTTP 1.1 la plus référencée. Malheureusement sa description de l'idempotence était vague , ce qui laisse place à tous ces débats. Mais cette spécification a été remplacée par la RFC 7231. Cité de la RFC 7231, section 4.2.2 Méthodes idempotentes , je souligne:
Donc, il est écrit dans les spécifications, l'idempotence est une question d'effet sur le serveur. Le premier DELETE renvoyant un 204 puis DELETE ultérieur renvoyant 404, un tel code d'état différent ne rend PAS le DELETE non idempotent. Utiliser cet argument pour justifier une déclaration 204 ultérieure n'est tout simplement pas pertinent.
OK donc il ne s'agit pas d'idempotence. Mais alors une question de suivi peut être, que se passe-t-il si nous choisissons toujours d'utiliser 204 dans DELETE ultérieur? Est-ce que c'est bon?
Bonne question. La motivation est compréhensible: permettre au client d'atteindre le résultat souhaité, sans se soucier de la gestion des erreurs. Je dirais que renvoyer 204 dans DELETE ultérieur est un "mensonge blanc" côté serveur largement inoffensif, dont le côté client ne fera pas immédiatement la différence. C'est pourquoi il y a des gens qui font cela dans la nature et cela fonctionne toujours. Gardez simplement à l'esprit qu'un tel mensonge peut être considéré comme sémantiquement bizarre, car "GET / non-exist" renvoie 404 mais "DELETE / non-exist" donne 204, à ce moment-là, le client comprendra que votre service n'est pas entièrement conforme section 6.5.4 404 introuvable .
Mais alors, la manière prévue suggérée par RFC 7231, c'est-à-dire renvoyer 404 lors de la suppression ultérieure, ne devrait pas être un problème en premier lieu. De nombreux autres développeurs ont choisi de le faire. C'est probablement parce que tout client qui implémente HTTP DELETE (ou toute méthode HTTP, d'ailleurs), ne supposerait pas aveuglément que le résultat serait toujours réussi 2xx. Et puis, une fois que le développeur commence à envisager la gestion des erreurs, 404 Not Found serait l'une des premières erreurs qui viendraient à l'esprit. À ce stade, il / elle en tirerait avec un peu de chance une conclusion selon laquelle il est sémantiquement sûr pour une opération HTTP DELETE d'ignorer une erreur 404. Problème résolu.
la source