HTTP distingue deux propriétés:
L'idempotence est définie par la spécification comme suit:
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. 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.
Et la sécurité:
En particulier, la convention a été établie que les méthodes GET
et NE DEVRAIENT PAS avoir la signification de prendre une action autre que la récupération. Ces méthodes doivent être considérées comme « sûres ». Cela permet aux agents utilisateurs de représenter d'autres méthodes, telles que , et , de manière spéciale, afin que l'utilisateur soit informé du fait qu'une action potentiellement dangereuse est demandée.HEAD
POST
PUT
DELETE
Naturellement, il n'est pas possible de garantir que le serveur ne génère pas d'effets secondaires suite à l'exécution d'une GET
requête; en fait, certaines ressources dynamiques considèrent cette fonctionnalité. La distinction importante ici est que l'utilisateur n'a pas demandé les effets secondaires et ne peut donc pas en être tenu responsable.
Notez que la sécurité implique l'idempotence: si une méthode n'a pas d'effets secondaires, la répéter plusieurs fois produira le même effet secondaire qu'une seule fois, à savoir aucune.
Cela met les méthodes en trois catégories:
- coffre - fort (et donc aussi idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotent mais pas nécessairement sans danger:
PUT
,DELETE
- ni idempotent ni sûr:
POST
PUT ne doit avoir aucun effet secondaire.
C'est faux. PUT
est idempotent mais pas sûr. Le point entier de PUT
est d'avoir un effet secondaire, la mise à jour à savoir une ressource. L'idempotence signifie que la mise à jour de la même ressource avec le même contenu plusieurs fois devrait avoir le même effet qu'une seule mise à jour.
Notez le dernier paragraphe de la section sur la sécurité [c'est moi qui souligne]:
Naturellement, il n'est pas possible de garantir que le serveur ne génère pas d'effets secondaires suite à l'exécution d'une GET
requête; en fait, certaines ressources dynamiques considèrent cette fonctionnalité. La distinction importante ici est que l'utilisateur n'a pas demandé les effets secondaires et ne peut donc pas en être tenu responsable .
Bien que cette phrase parle de GET
sécurité, nous pouvons supposer que les auteurs ont également voulu appliquer le même raisonnement PUT
et la même idempotence. IOW: PUT
ne devrait avoir qu'un seul effet secondaire visible par l' utilisateur , à savoir la mise à jour de la ressource nommée. Cela peut avoir d'autres effets secondaires, mais l'utilisateur ne peut en être tenu responsable.
Par exemple, le fait qu'il PUT
soit idempotent signifie que je peux le réessayer aussi souvent que je le souhaite: la spécification garantit que l'exécuter plusieurs fois sera exactement la même chose que l'exécuter une fois. Il est parfaitement valable de créer un arriéré d'anciennes révisions comme effet secondaire de ces multiples PUT
demandes. Cependant, si, à la suite de plusieurs tentatives, votre base de données se remplit d'un arriéré d'anciennes révisions, ce n'est pas mon problème, c'est le vôtre.
IOW: vous êtes autorisé à avoir autant d'effets secondaires que vous le souhaitez, mais
- il doit regarder l'utilisateur comme si ses demandes étaient idempotentes
- vous êtes responsable de ces effets secondaires, pas l'utilisateur