Die Leute, die HTTP / 2 entwarfen, äußerten sich viel ausführlicher über ihre Ideen, was HTTP tun sollte, während sie die alte Bedeutung beibehielten. Mal sehen, was die HTTP / 2-Entwurfsspezifikation über Idempotenz zu sagen hat:
4.2.2. Idempotente Methoden
Eine Anforderungsmethode wird als "idempotent" betrachtet, wenn die beabsichtigte Auswirkung mehrerer identischer Anforderungen mit dieser Methode auf den Server dieselbe ist wie die Auswirkung einer einzelnen solchen Anforderung. Von den in dieser Spezifikation definierten Anforderungsmethoden sind PUT, DELETE und sichere Anforderung Methoden sind idempotent.
Wie die Definition von safe gilt die idempotente Eigenschaft nur für das, was vom Benutzer angefordert wurde. Es steht einem Server frei, jede Anforderung separat zu protokollieren, einen Revisionskontrollverlauf beizubehalten oder andere nicht idempotente Nebenwirkungen für jede idempotente Anforderung zu implementieren .
Die beabsichtigte Auswirkung auf den Server für jede solche PUT-Anforderung besteht darin, die durch diesen URI identifizierte Ressource zu aktualisieren . Genau das passiert in Ihrem Fall.
Dass Sie sich für die Versionsverwaltung entscheiden, spielt hier keine Rolle. Wenn Sie keine neue Version erstellen möchten, wenn sich nichts geändert hat, müssen Sie die Nutzdaten in der PUT-Anforderung mit der neuesten (oder anderweitig identifizierten) Version der Ressource vergleichen und wenn sich keine der Eigenschaften geändert hat Sie können festlegen, dass keine neue Version erstellt werden soll .
Ihre Bearbeitung:
Der Verlauf ist für den Benutzer sichtbar. Ein mehrmaliger Aufruf würde zu mehreren Versionen führen
Für die Ressource ist dies kein Nebeneffekt . Die Ressource an diesem URI ändert sich nicht (dieselben Eigenschaften erhalten PUT). Der Verlauf besteht nur aus Metadaten, da er höchstwahrscheinlich von einem anderen URI oder mit unterschiedlichen Anforderungsheadern angefordert wird.
time
Immobilie aktualisiert wird? Ich denke, das sind auch Metadaten, obwohl sie in der Ressource enthalten sind.HTTP unterscheidet zwei Eigenschaften:
Die Idempotenz wird durch die Spezifikation wie folgt definiert:
Und Sicherheit:
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:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
Das ist falsch.
PUT
ist idempotent aber nicht sicher. Der springende Punkt derPUT
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]:
Obwohl dieser Satz über
GET
und Sicherheit spricht , können wir davon ausgehen, dass die Autoren auch beabsichtigten, dieselbe Argumentation aufPUT
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 mehrfachenPUT
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
quelle
Sie haben Recht, dass PUT keine Nebenwirkungen haben muss , aber ich würde dem etwas hinzufügen.
Sie aktualisieren eine
person
Ressource, die als gekennzeichnet istF02E395A235
, sodass die Verwendung von PUT korrekt ist. Als Geschäftsregel verfolgen Sie jetzt auch Änderungen, die für die aufrufende Entität (Verbraucher des REST-Service) unsichtbar sind. Dadurch wird derperson
Ressource kein neues Element hinzugefügt . Auf den historischen Schnappschuss kann über den/person/
Endpunkt nicht zugegriffen werden. Daher glaube ich, dass PUT in diesem Fall durchaus akzeptabel sein sollte.quelle