Ich habe mich darüber gewundert.
Angenommen, ich habe eine user
Ressource mit id
und name
Feldern. Wenn ich ein Feld aktualisieren möchte, könnte ich einfach eine PATCH-Anfrage an die Ressource wie folgt senden
PATCH /users/42
{"name": "john doe"}
Anschließend aktualisiert die Anwendung den Namen des Benutzers 42.
Aber warum ist das Ergebnis anders, wenn ich diese Aufforderung wiederhole?
Gemäß RFC 5789
PATCH ist weder sicher noch idempotent
rest
api-design
http
web-api
Mattecapu
quelle
quelle
{"name": "bendjamin franklin"}
Antworten:
Eine PATCH-Anfrage kann idempotent sein, muss es aber nicht. Das ist der Grund, warum es als nicht idempotent charakterisiert wird.
Ob PATCH idempotent sein kann oder nicht, hängt stark davon ab, wie die erforderlichen Änderungen kommuniziert werden.
Wenn das Patch-Format beispielsweise die Form von hat
{change: 'Name' from: 'benjamin franklin' to: 'john doe'}
, hat jede PATCH-Anforderung nach der ersten eine andere Auswirkung (eine Fehlerantwort) als die erste Anforderung.Ein weiterer Grund für Nicht-Idempotenz kann sein, dass das Anwenden der Änderung auf etwas anderes als die ursprüngliche Ressource die Ressource ungültig machen kann. Dies wäre dann auch der Fall, wenn Sie die Änderung mehrfach anwenden.
quelle
<name>
Element vorhanden ist. Wenn der PATCH<name>
einer Ressource ein Element hinzufügt , das ursprünglich kein Element enthielt, wird die Ressource durch zweimaliges Anwenden des PATCH (oder durch Anwenden auf eine Ressource, die bereits ein Element enthält<name>
) ungültig, da sie plötzlich zwei<name>
Elemente enthält, die nicht zulässig sind für solche Ressourcen.Ich denke, klare Antwort, wenn PATCH nicht idempotent ist dieser Absatz aus RFC 5789:
Da RFC angibt, dass der Patch einige "allgemeine Änderungen" an der Ressource enthält, sollten wir uns nicht nur mit dem Ersetzen von Feldern befassen. Wenn es sich bei der Ressource um einen Zähler handelt, kann der Patch das Inkrement anfordern, was eindeutig nicht idempotet ist.
quelle
PATCH
Anforderungen beschreiben eine Gruppe von Vorgängen, die auf eine Ressource angewendet werden sollen. Wenn Sie dieselbe Gruppe von Vorgängen zweimal auf dieselbe Ressource anwenden, ist das Ergebnis möglicherweise nicht dasselbe. Dies liegt daran, dass Sie die Operationen selbst definieren können. Mit anderen Worten, Sie müssen die Zusammenführungsregeln definieren .Denken Sie daran, dass eine
PATCH
Anfrage zum Patchen von Ressourcen in vielen verschiedenen Formaten verwendet werden kann, nicht nur für JSON.Eine
PATCH
Anfrage kann also idempotent sein, wenn Sie die Zusammenführungsregeln als idempotent definieren .Idempotentes Beispiel:
Nicht idempotentes Beispiel:
Im zweiten Beispiel habe ich eine "Mongo-ähnliche" Syntax verwendet, die ich für das Inkrementieren eines Attributs erfunden habe. Dies ist eindeutig nicht idempotent, da das mehrmalige Senden derselben Anfrage jedes Mal zu unterschiedlichen Ergebnissen führen würde.
Jetzt fragen Sie sich vielleicht, ob die Verwendung einer solchen Syntax gültig ist. Nach Standards ist es:
Und vielleicht fragen Sie sich auch, ob es sich lohnt ,
PATCH
Anfragen auf diese Weise zu verwenden, und viele Leute sind der Meinung , dass dies nicht der Fall ist. Hier finden Sie eine gute Antwort mit vielen Kommentaren zu diesem Problem.quelle