HTTP unterscheidet zwei Eigenschaften:
Die Idempotenz wird durch die Spezifikation wie folgt definiert:
Methoden können auch die Eigenschaft " Idempotenz " haben, da (abgesehen von Fehler- oder Ablaufproblemen) die Nebenwirkungen von N> 0 identischen Anforderungen dieselben sind wie für eine einzelne Anforderung. Die Methoden GET
, HEAD
, PUT
und DELETE
diese Eigenschaft teilen. Außerdem sollten die Methoden OPTIONS
und TRACE
NICHT Nebenwirkungen haben und sind daher von Natur aus idempotent.
Und Sicherheit:
Insbesondere wurde die Konvention festgelegt, dass die GET
und HEAD
Methoden NICHT die Bedeutung haben sollten, eine andere Aktion als das Abrufen zu ergreifen. Diese Methoden sollten als " sicher " angesehen werden. Auf diese Weise kann Benutzeragenten andere Methoden zur Darstellung, wie POST
, PUT
und DELETE
in einer besonderen Art und Weise, so dass der Anwender der Tatsache bewusst gemacht wird , dass eine möglicherweise gefährliche Aktion angefordert wird.
Natürlich kann nicht sichergestellt werden, dass der Server durch die Ausführung einer GET
Anforderung keine Nebenwirkungen erzeugt . In der Tat betrachten einige dynamische Ressourcen dies als eine Funktion. Der wichtige Unterschied besteht darin, dass der Benutzer die Nebenwirkungen nicht angefordert hat und daher nicht für sie zur Rechenschaft gezogen werden kann.
Beachten Sie, dass Sicherheit Idempotenz impliziert: Wenn eine Methode keine Nebenwirkungen hat, führt die mehrfache Durchführung zu derselben Nebenwirkung wie die einmalige Durchführung, nämlich zu keiner.
Dadurch werden die Methoden in drei Kategorien eingeteilt:
- Safe (und damit auch idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotent aber nicht unbedingt sicher :
PUT
,DELETE
- weder idempotent noch sicher:
POST
PUT darf keine Nebenwirkungen haben.
Das ist falsch. PUT
ist idempotent aber nicht sicher. Der springende Punkt der PUT
ist , eine Nebenwirkung haben, und zwar auf eine Ressource zu aktualisieren. Was Idempotenz bedeutet, ist, dass das mehrmalige Aktualisieren derselben Ressource mit demselben Inhalt den gleichen Effekt haben sollte wie das nur einmalige Aktualisieren.
Beachten Sie den letzten Absatz im Abschnitt über Sicherheit [Schwerpunkt Mine]:
Natürlich kann nicht sichergestellt werden, dass der Server durch die Ausführung einer GET
Anforderung keine Nebenwirkungen erzeugt . In der Tat betrachten einige dynamische Ressourcen dies als eine Funktion. Der wichtige Unterschied besteht darin, dass der Benutzer die Nebenwirkungen nicht angefordert hat und daher nicht für sie zur Rechenschaft gezogen werden kann .
Obwohl dieser Satz über GET
und Sicherheit spricht , können wir davon ausgehen, dass die Autoren auch beabsichtigten, dieselbe Argumentation auf PUT
und Idempotenz anzuwenden . IOW: PUT
sollte nur einen vom Benutzer sichtbaren Nebeneffekt haben, nämlich das Aktualisieren der genannten Ressource. Es kann andere Nebenwirkungen haben, aber der Benutzer kann nicht dafür verantwortlich gemacht werden.
Zum Beispiel bedeutet die Tatsache, dass PUT
es idempotent ist, dass ich es so oft wiederholen kann, wie ich möchte: Die Spezifikation garantiert, dass die mehrfache Ausführung genau die gleiche ist wie die einmalige Ausführung. Es ist absolut gültig, einen Rückstand alter Revisionen als Nebeneffekt dieser mehrfachen PUT
Anforderungen zu erstellen . Wenn sich Ihre Datenbank jedoch aufgrund mehrerer Wiederholungsversuche mit einem Rückstand alter Revisionen füllt, ist dies nicht mein Problem, sondern Ihr Problem.
IOW: Sie dürfen so viele Nebenwirkungen haben, wie Sie möchten, aber
- Es muss für den Benutzer so aussehen, als ob seine Anforderungen idempotent wären
- Sie sind für diese Nebenwirkungen verantwortlich, nicht der Benutzer