Hintergrundinformationenanalyse:
Gemäß RFC 2616, § 9.5 wird POST
verwendet, um eine Ressource zu erstellen:
Die POST-Methode wird verwendet, um zu fordern, dass der Ursprungsserver die im Request eingebettete Entität als neue untergeordnete Ressource der im Request-Zeilen-URI identifizierten Ressource akzeptiert.
Gemäß RFC 2616, § 9.6 wird PUT
verwendet, um eine Ressource zu erstellen oder zu ersetzen:
Die PUT-Methode fordert, dass die eingebettete Entität unter dem bereitgestellten Request-URI gespeichert wird. Wenn der Request-URI auf eine bereits vorhandene Ressource verweist, sollte die eingebettete Entität als modifizierte Version derjenigen angesehen werden, die auf dem Ursprungsserver liegt. Wenn der Request-URI nicht auf eine vorhandene Ressource zeigt und dieser URI als neue Ressource vom anfordernden User-Agent definiert werden kann, kann der Ursprungsserver die Ressource mit diesem URI erstellen.
Meine Frage:
Also, welche HTTP-Methode sollte verwendet werden, um eine Ressource zu erstellen? Oder sollten beide unterstützt 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