- POST an eine URL erstellt ein untergeordnetes Ressourcen an einer serverdefinierten URL.
- PUT an eine URL erstellt/ersetzt die Ressource als Ganzes an der vom Client definierten URL.
- PATCH an eine URL aktualisiert Teile der Ressource an dieser vom Client definierten URL.
Die relevante Spezifikation für PUT und POST ist RFC 2616 §9.5ff.
POST erstellt eine untergeordnete Ressource, also erstellt POST zu /items
eine Ressource, die unter der /items
Ressource liegt. Zum Beispiel. /items/1
. Das Senden des gleichen POST-Pakets zweimal erstellt zwei Ressourcen.
PUT dient dazu, eine Ressource an einer vom Client bekannten URL zu erstellen oder zu ersetzen.
Also: PUT ist nur eine Option für CREATE, wenn der Client die URL bereits kennt, bevor die Ressource erstellt wird. z.B. /blogs/nigel/entry/when_to_use_post_vs_put
da der Titel als Schlüssel für die Ressource verwendet wird
PUT ersetzt die Ressource an der bekannten URL, wenn sie bereits existiert, daher hat das zweimalige Senden derselben Anfrage keine Auswirkungen. Mit anderen Worten, Aufrufe an PUT sind idempotent.
Der RFC liest sich wie folgt:
Der grundlegende Unterschied zwischen den POST- und PUT-Anfragen spiegelt sich in der unterschiedlichen Bedeutung des Request-URI wider. Die URI in einer POST-Anfrage identifiziert die Ressource, die die beigefügte Entität verarbeiten wird. Diese Ressource kann ein Datenakzeptierungsprozess, ein Gateway zu einem anderen Protokoll oder eine separate Entität sein, die Anmerkungen akzeptiert. Im Gegensatz dazu identifiziert die URI in einer PUT-Anfrage die Entität, die mit der Anfrage beigefügt wird - der Benutzeragent weiß, für welchen URI er gedacht ist, und der Server DARF NICHT versuchen, die Anfrage auf eine andere Ressource anzuwenden. Wenn der Server möchte, dass die Anfrage auf einen anderen URI angewendet wird,
Hinweis: PUT wurde hauptsächlich zum Aktualisieren von Ressourcen (durch vollständiges Ersetzen) verwendet, aber in letzter Zeit gibt es eine Bewegung hin zur Verwendung von PATCH zur Aktualisierung vorhandener Ressourcen, da PUT angibt, dass es die gesamte Ressource ersetzt. RFC 5789.
Update 2018: Es gibt einen Fall, der dazu führen kann, PUT zu vermeiden. Siehe "REST ohne PUT"
Mit der Technik "REST ohne PUT" sollen Verbraucher gezwungen werden, neue 'nomenalisierte' Anforderungsressourcen zu posten. Wie bereits diskutiert, ist das Ändern der Postadresse eines Kunden ein POST zu einer neuen "ChangeOfAddress"-Ressource, nicht ein PUT einer "Customer"-Ressource mit einem anderen Postadressfeldwert.
entnommen aus REST API Design - Ressourcenmodellierung von Prakash Subramaniam von Thoughtworks
Dadurch wird die API dazu gezwungen, Zustandsübergangsprobleme mit mehreren Clients, die eine einzelne Ressource aktualisieren, zu vermeiden, und passt besser zu Ereignisquellen und CQRS. Wenn die Arbeit asynchron erledigt wird, scheint das Posten der Transformation und das Warten darauf, dass sie angewendet wird, angemessen.
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