Ich habe die HTTP-Dokumentation gelesen, kann jedoch nicht verstehen, was Idempotenz ist. Kann jemand helfen, bitte . Vielen Dank im Voraus.
Idempotency ist eine Eigenschaft von HTTP-Methoden. Eine Anforderung mit einer idempotenten HTTP-Methode kann mehrmals ausgeführt werden, und es wird dasselbe Ergebnis erzeugt.
Verstehen Sie Ergebnis als Status der Ressource auf dem Server (und beachten Sie, dass Statuscodes aus Sicht der Idempotenz nicht relevant sind).
Schauen wir uns den RFC 7231 an, das Dokument definiert die Semantik und den Inhalt des HTTP/1.1-Protokolls. Siehe die Zitate unten (Highlights sind meine).
HTTP-Methoden können safe sein:
Request-Methoden gelten als "sicher", wenn ihre definierte Semantik im Wesentlichen schreibgeschützt ist; d. h., der Client fordert keine Zustandsänderung auf dem Origin-Server an und erwartet sie nicht als Ergebnis der Anwendung einer sicheren Methode auf eine Zielressource. [...]
Von den in dieser Spezifikation definierten Anforderungsmethoden sind die Methoden
GET
,HEAD
,OPTIONS
undTRACE
als sicher definiert. [...]
Und/oder idempotent:
Eine Anforderungsmethode wird als "idempotent" betrachtet, wenn die beabsichtigte Auswirkung mehrerer identischer Anforderungen mit dieser Methode auf dem Server mit der Auswirkung einer einzelnen solchen Anforderung identisch ist. Von den in dieser Spezifikation definierten Anforderungsmethoden sind
PUT
,DELETE
und sichere Anforderungsmethoden idempotent. [...]
Zusammenfassend werden die HTTP-Methoden als Folgende klassifiziert:
+---------+------+------------+
| Method | Safe | Idempotent |
+---------+------+------------+
| CONNECT | no | no |
| DELETE | no | yes |
| GET | yes | yes |
| HEAD | yes | yes |
| OPTIONS | yes | yes |
| POST | no | no |
| PUT | no | yes |
| TRACE | yes | yes |
+---------+------+------------+
Der RFC 5789 definiert die PATCH
-Methode, die weder sicher noch idempotent ist. Um jedoch Kollisionen zu vermeiden, kann PATCH
request so ausgegeben werden, dass es idempotent ist, wie unten angegeben:
Eine
PATCH
-Anforderung kann so ausgegeben werden, dass sie idempotent ist, was auch dazu beiträgt, schlechte Ergebnisse durch Kollisionen zwischen zweiPATCH
-Anforderungen auf derselben Ressource in einem ähnlichen Zeitraum zu verhindern. Kollisionen aus mehrerenPATCH
-Anforderungen können gefährlicher sein alsPUT
-Kollisionen, da einige Patch-Formate von einem bekannten Basispunkt aus ausgeführt werden müssen, da sonst die Ressource beschädigt wird. Clients, die diese Art von Patch-Anwendung verwenden, SOLLTEN eine bedingte Anforderung verwenden, sodass die Anforderung fehlschlägt, wenn die Ressource seit dem letzten Zugriff der Clients auf die Ressource aktualisiert wurde. Beispielsweise kann der Client in derETag
-Anforderung eine starkePATCH
in einemIf-Match
-Header verwenden.
Nach meinem Verständnis hat Idempotenz nichts mit dem Ergebnis (= Server Response) zu tun, sondern mit dem Server-Status nach einem oder mehreren Aufrufen.
Angenommen, Sie möchten eine Ressource auf dem Server durch Aufrufen löschen
DELETE /resource/123
Der Aufruf kann mit einem HTTP-Response 200 OK
und der gelöschten Ressource als Nutzlast überhaupt erst zurückkehren. Bei einem zweiten Aufruf lautet die Antwort 204 NO_CONTENT
, da die Ressource bereits beim ersten Aufruf gelöscht wurde.
Nach jeder Anforderung ist der Server-Status derselbe, daher ist die Idempotenz erfüllt. Das HTTP/1.1 sagt nichts über die Antwort aus
Eine Anforderungsmethode wird als "idempotent" betrachtet, wenn die beabsichtigte Wirkung auf Der Server mit mehreren identischen Anforderungen mit dieser Methode ist der das gleiche wie der Effekt für eine einzelne solche Anfrage
Eine idempotente HTTP-Methode ist eine HTTP-Methode, die viele Male ohne unterschiedliche Ergebnisse aufgerufen werden kann. Es spielt keine Rolle, ob die Methode nur einmal oder zehnmal aufgerufen wird. Das Ergebnis sollte dasselbe sein. Dies bedeutet im Wesentlichen, dass das Ergebnis einer erfolgreich ausgeführten Anforderung unabhängig davon ist, wie oft sie ausgeführt wird. In der Arithmetik beispielsweise ist das Hinzufügen von Null zu einer Zahl eine idempotente Operation.
POST ist NICHT idempotent. GET, PUT, DELETE, HEAD, OPTIONS und TRACE sind idempotent.
1> POST -> Jedes Mal, wenn Sie diese Methode aufrufen, wird ein anderes Ergebnis angezeigt. Warum -> Stellen Sie sich ein Szenario vor, in dem Sie neue Ressourcen erstellen. Jedes Mal, wenn Sie diese Methode aufrufen, werden neue Ressourcen erstellt. Sie erhalten jedes Mal ein anderes Ergebnis und daher ist POST (in einfachem Wort "Einfügen") keine idempotente Methode.
2> Andere geben Ihnen das gleiche Ergebnis