Les rédacteurs de HTTP / 2 étaient beaucoup plus bavards sur leurs idées de ce que HTTP devrait faire, tout en conservant l'ancien sens. Voyons ce que le projet de spécification HTTP / 2 a à dire sur l'idempotence:
4.2.2. Méthodes idempotentes
Une méthode de demande est considérée comme "idempotente" si l'effet prévu sur le serveur de plusieurs demandes identiques avec cette méthode est le même que l'effet pour une seule demande de ce type. Parmi les méthodes de demande définies par cette spécification, PUT, DELETE et demande sécurisée les méthodes sont idempotentes.
Comme la définition de coffre-fort, la propriété idempotent ne s'applique qu'à ce qui a été demandé par l'utilisateur; un serveur est libre de consigner chaque demande séparément, de conserver un historique de contrôle des révisions ou d'implémenter d'autres effets secondaires non idempotents pour chaque demande idempotente .
L' effet prévu sur le serveur pour chacune de ces demandes PUT est de mettre à jour la ressource identifiée par cet URI . C'est exactement ce qui se passe dans votre cas.
Que vous décidiez de mettre à jour les ressources n'a pas vraiment d'importance ici. Si vous ne souhaitez pas créer une nouvelle version lorsque rien n'a changé, vous devrez comparer la charge utile de la demande PUT avec la version la plus récente (ou autrement identifiée) de la ressource, et lorsqu'aucune des propriétés n'a changé. vous pouvez choisir de ne pas créer de nouvelle version .
Votre modification:
L'historique sera visible pour l'utilisateur, appeler plusieurs fois entraînerait des multipleversions
En ce qui concerne la ressource, ce n'est pas un effet secondaire . La ressource à cet URI ne change pas (les mêmes propriétés obtiennent PUT). L'historique n'est que des métadonnées, car il est très probablement demandé par un URI différent ou avec des en-têtes de demande différents.
time
propriété soit mise à jour? Je pense que ce sont aussi des métadonnées, même si c'est dans la ressource.HTTP distingue deux propriétés:
L'idempotence est définie par la spécification comme suit:
Et la sécurité:
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:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
C'est faux.
PUT
est idempotent mais pas sûr. Le point entier dePUT
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]:
Bien que cette phrase parle de
GET
sécurité, nous pouvons supposer que les auteurs ont également voulu appliquer le même raisonnementPUT
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 multiplesPUT
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
la source
Vous avez raison de dire que PUT ne doit avoir aucun effet secondaire , mais j'ajouterais quelque chose à cela.
Vous mettez à jour une
person
ressource qui est identifiée commeF02E395A235
, donc l'utilisation de PUT est correcte. Désormais, en règle générale, vous gardez également une trace des modifications qui ne sont pas visibles par l'entité appelante (consommateur du service REST). Cela n'ajoutera pas un nouvel élément dans laperson
ressource. L'instantané historique ne sera pas accessible à l'aide du/person/
point de terminaison. Je pense donc que le PUT devrait être parfaitement acceptable dans ce cas.la source