Zusammenfassung
- Verwenden Sie
PUT
, um den Zustand der Ziel-Ressource mit dem in der Anforderung enthaltenen Zustand zu erstellen oder zu ersetzen. Dieser beabsichtigte Effekt ist standardisiert und idempotent, sodass Zwischenhändler informiert werden können, dass sie eine Anfrage im Falle eines Kommunikationsfehlers wiederholen können.
- Verwenden Sie andernfalls
POST
(einschließlich zum Erstellen oder Ersetzen des Zustands einer Ressource, die nicht die Zielressource ist). Der beabsichtigte Effekt ist nicht standardisiert, sodass Zwischenhändler keine Annahme treffen können.
Referenzen
Die neueste maßgebliche Beschreibung des semantischen Unterschieds zwischen den Anforderungsmethoden POST
und PUT
finden Sie in RFC 9110 (Roy Fielding, Mark Nottingham, Julian Reschke, 2022):
Der grundlegende Unterschied zwischen den Methoden POST
und PUT
wird durch die unterschiedliche Absicht für die enthaltene Repräsentation hervorgehoben. Die Zielressource in einer POST
-Anforderung soll die enthaltene Repräsentation gemäß den eigenen Semantiken der Ressource verarbeiten, während die enthaltene Repräsentation in einer PUT
-Anforderung als Ersetzen des Zustands der Zielressource definiert ist. Daher ist die Absicht von PUT
idempotent und für Zwischenhändler sichtbar, obwohl der genaue Effekt nur vom Ursprungsserver bekannt ist.
Mit anderen Worten, der beabsichtigte Effekt von PUT
ist standardisiert (Erstellen oder Ersetzen des Zustands der Ziel-Ressource mit dem in der Anforderung enthaltenen Zustand) und daher generisch für alle Zielressourcen, während der beabsichtigte Effekt von POST
nicht standardisiert ist und daher spezifisch für jede Zielressource ist. Daher kann POST
für alles verwendet werden, einschließlich für das Erreichen der beabsichtigten Effekte von PUT
und anderen Anforderungsmethoden (GET
, HEAD
, DELETE
, CONNECT
, OPTIONS
und TRACE
).
Es wird jedoch empfohlen, immer die spezialisiertere Anforderungsmethode anstelle von POST
zu verwenden, wenn dies möglich ist, da sie Zwischenhändlern mehr Informationen für die Automatisierung der Informationsabfrage bereitstellt (da GET
, HEAD
, OPTIONS
und TRACE
als sicher definiert sind), die Behandlung von Kommunikationsfehlern erleichtert (da GET
, HEAD
, PUT
, DELETE
, OPTIONS
und TRACE
als idempotent definiert sind) und die Cache-Leistung optimiert (da GET
und HEAD
als cacheable definiert sind), wie in It Is Okay to Use POST (Roy Fielding, 2009) erklärt wird:
POST
wird nur zu einem Problem, wenn es in einer Situation verwendet wird, für die eine andere Methode ideal geeignet ist: z. B. die Abfrage von Informationen, die eine Repräsentation einer Ressource sein sollte (GET
), die vollständige Ersetzung einer Repräsentation (PUT
) oder eine der anderen standardisierten Methoden, die Zwischenhändlern wertvollere Informationen als "dies könnte etwas ändern" mitteilen. Die anderen Methoden sind für Zwischenhändler wertvoller, da sie etwas über die automatische Behandlung von Fehlern und das Optimieren des Verhaltens von Zwischenspeichern aussagen. POST
hat diese Eigenschaften nicht, aber das bedeutet nicht, dass wir ohne ihn auskommen können. POST
erfüllt viele nützliche Zwecke in HTTP, einschließlich des allgemeinen Zwecks von "diese Aktion ist es nicht wert, standardisiert zu werden".
66 Stimmen
Es kann hilfreich sein, die Definitionen in HTTPbis zu verwenden - Roy hat sich viel Arbeit gemacht, um sie zu klären. Siehe: tools.ietf.org/html/…
19 Stimmen
Nur um den Kommentar von @MarkNottingham auf den neuesten Stand zu bringen, hier sind POST und PUT, wie sie auf HTTPbis definiert sind.
48 Stimmen
Es scheint mir, dass dieser Diskurs aus der gängigen Praxis entstanden ist, REST durch die Beschreibung der HTTP-Methoden in Bezug auf CRUD-Operationen zu vereinfachen.
7 Stimmen
Leider sind die ersten Antworten zu POST falsch. Überprüfen Sie meine Antwort für eine bessere Erklärung der Unterschiede: stackoverflow.com/a/18243587/2458234
35 Stimmen
PUT und POST sind beide unsichere Methoden. PUT ist jedoch idempotent, während POST es nicht ist. - Weitere Informationen finden Sie unter: restcookbook.com/HTTP%20Methods/put-vs-post/…
4 Stimmen
Du weißt... mir ist klar, dass die Spezifikation PUT als 'aktualisieren' bezeichnet, aber ich denke, jeder wäre viel weniger verwirrt, wenn wir es 'ersetzen' nennen würden, das ist schließlich, was es tut.
3 Stimmen
Im Prinzip funktioniert POST gut für das Erstellen von Ressourcen. Die URL der neu erstellten Ressource sollte im Location-Antwortheader zurückgegeben werden. PUT sollte verwendet werden, um eine Ressource vollständig zu aktualisieren. Bitte verstehen Sie, dass dies die bewährten Methoden beim Entwerfen einer RESTful-API sind. Die HTTP-Spezifikation als solche schränkt die Verwendung von PUT/POST für das Erstellen/Aktualisieren von Ressourcen nicht ein paar Einschränkungen ein. Werfen Sie einen Blick auf techoctave.com/c7/posts/71-twitter-rest-api-dissected, das die bewährten Methoden zusammenfasst.
3 Stimmen
Idempotenz
ist der Schlüssel. Lesen Sie PUT oder POST: Die REST-Geschichte von John Calcote. Wenn Ihre Methode idempotent ist, verwenden Sie PUT. Andernfalls verwenden Sie POST.2 Stimmen
Ich verstehe den vorherrschenden Konsens dazu nicht. Die Zitierung des OP für PUT beginnt mit "Die PUT-Methode fordert, dass die enthaltene Entität gespeichert wird....". Das sagt mir "Erstellung". Wenn wir über "etwas hinzufügen" sprechen, sprechen wir von einem Ort, an dem es zuvor nicht war. Du "fuegst" etwas nicht hinzu, um es zu ändern. Wenn Sie ein Dokument ändern, fügen Sie nicht ein neues hinzu. Die Verwendung des HTTP-Verbs PUT um "aktualisieren" zu bedeuten, ist eine schlechte semantische Anpassung.
1 Stimmen
PUT begann als Möglichkeit für frühe Microsoft HTML-Designwerkzeuge, Inhalte direkt auf einen Server zu veröffentlichen. Die Tatsache, dass es auch zum Aktualisieren (im Großen und Ganzen) verwendet wurde, war auf das Fehlen einer anderen Aktualisierungsmethode zurückzuführen. Auch wenn es sich um ein Großhandels-Update handelte, war es wirklich eine Erstellung, nur eine, die idempotent war. Ein "Update" impliziert, dass ein Aspekt des vorherigen Zustands beibehalten wurde.
1 Stimmen
Echtes Szenario in der Elasticsearch-Dokumentation: elastic.co/guide/en/elasticsearch/reference/current/…. Werfen Sie einen Blick auf den Unterschied zwischen allen PUT-Anfragen und dem letzten POST-Anfragebeispiel.
0 Stimmen
Das
JavaBrains
erklärt es sehr klar. Schau dir youtube.com/watch?v=rhTkRK53XdQ an.0 Stimmen
Die Unterschied zwischen den Methoden POST vs PUT sollte im definierten Kontext beschrieben werden. Zum Beispiel hier, die Frage dreht sich um REST und dreht sich tatsächlich um Konsistenz und eine einheitliche Schnittstelle. Solange du die Konsistenz im API-Design respektierst, bist du auf dem richtigen Weg.
0 Stimmen
Beachten Sie, dass wenn Sie möchten, dass eine Webanwendung auch funktioniert, wenn JavaScript deaktiviert ist, sollten Sie POST verwenden: stackoverflow.com/questions/630453/put-vs-post-in-rest/…
0 Stimmen
Die zitierte Aussage des OP über POST ist nicht mehr gültig. "Die tatsächliche Funktion, die von der POST-Methode ausgeführt wird, wird vom Server bestimmt und hängt normalerweise vom effektiven Anfrageresource-Identifikator (URI) ab. Die Aktion, die von der POST-Methode ausgeführt wird, führt möglicherweise nicht zu einer Ressource, die mit einem URI identifiziert werden kann." über tools.ietf.org/html/…
0 Stimmen
Die Idempotenz ist wichtig. Aber um idempotent zu sein, muss man einen eindeutigen Schlüssel (oder eine Reihe von Schlüsseln) haben. Wenn der eindeutige Schlüssel in einem POST-Aufruf zweimal angegeben wird, sollte der zweite einen Fehler erzeugen. In einem PUT-Aufruf sollte er das Ressource erstellen/aktualisieren/ersetzen. Es ist möglich, einen POST-Aufruf ohne einen eindeutigen Schlüssel durchzuführen (es wird einfach jedes Mal eine neue Ressource erstellt). Es ist jedoch nicht möglich, einen PUT-Aufruf ohne Schlüssel durchzuführen.
0 Stimmen
All diese Diskussionen über die Idempotenz von PUT und das Fehlen dieser Eigenschaft bei POST ignorieren das eigentliche Problem. Der Browser wird bei beiden, sogar bei POST, erneut versuchen, wenn die Verbindung vom Server geschlossen wird. Daher müssen Sie Ihre API so entwickeln, dass sie unabhhängig davon idempotent ist, damit Sie sich nicht beschweren können, wenn es passiert! :) Die Wahl der Methode ist fast belanglos. stackoverflow.com/questions/15155014/… w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.4