Neue Antwort (jetzt, da ich REST besser verstehe):
PUT ist lediglich eine Aussage darüber, welchen Inhalt der Service ab jetzt verwenden soll, um Repräsentationen der vom Client identifizierten Ressource darzustellen; POST ist eine Aussage darüber, welchen Inhalt der Service ab jetzt enthalten soll (möglicherweise dupliziert), aber es liegt am Server, wie dieser Inhalt identifiziert wird.
PUT x
(wenn x
eine Ressource identifiziert): "Ersetze den Inhalt der Ressource, die durch x
identifiziert wird, durch meinen Inhalt."
PUT x
(wenn x
keine Ressource identifiziert): "Erstelle eine neue Ressource, die meinen Inhalt enthält, und verwende x
, um sie zu identifizieren."
POST x
: "Speichere meinen Inhalt und gib mir einen Bezeichner, den ich verwenden kann, um eine Ressource (alt oder neu) zu identifizieren, die diesen Inhalt enthält (möglicherweise zusammen mit anderem Inhalt). Die genannte Ressource sollte identisch oder untergeordnet sein zu der, die x
identifiziert." "Ressource von y ist untergeordnet zu Ressource von x" wird typischerweise, aber nicht unbedingt, umgesetzt, indem y ein Unterverzeichnis von x wird (zum Beispiel x = /foo
und y = /foo/bar
) und die Repräsentation(en) der Ressource von x modifiziert werden, um die Existenz einer neuen Ressource widerzuspiegeln, zum Beispiel mit einem Hyperlink zur Ressource von y und einigen Metadaten. Letzteres ist für ein gutes Design wirklich wesentlich, da URLs in REST opak sind - Sie sollen stattdessen Hypermedia verwenden, anstatt auf der Client-Seite URL-Konstruktion zu verwenden, um den Dienst zu durchlaufen.
In REST gibt es keine Ressource, die "Inhalte" enthält. Ich bezeichne als "Inhalt" Daten, die der Service verwendet, um Repräsentationen konsistent darzustellen. Es besteht typischerweise aus einigen zugehörigen Zeilen in einer Datenbank oder einer Datei (zum Beispiel einer Bilddatei). Es liegt am Service, den Inhalt des Benutzers in etwas umzuwandeln, das der Service verwenden kann, zum Beispiel die Umwandlung eines JSON-Payloads in SQL-Anweisungen.
Ursprüngliche Antwort (vielleicht einfacher zu lesen):
PUT /etwas
(wenn /etwas
bereits existiert): "Nimm alles, was du bei /etwas
hast, und ersetze es durch das, was ich dir gebe."
PUT /etwas
(wenn /etwas
noch nicht existiert): "Nimm, was ich dir gebe, und platziere es bei /etwas
."
POST /etwas
: "Nimm, was ich dir gebe, und platziere es an beliebiger Stelle unter /etwas
, solange du mir die URL gibst, wenn du fertig bist."
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