6336 Stimmen

Was ist der Unterschied zwischen POST und PUT in HTTP?

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.

4voto

Michael Chourdakis Punkte 9603

Alle Antworten oben und unten sind korrekt, nur eine kleine (wichtige) Anmerkung. Alle diese "Verben" sind Empfehlungen und ihr Effekt ist nicht erzwungen. Der Server kann tun, was er will, und das bedeutet, dass er mit GET schreibt oder was auch immer der Server will. Alles hängt von der Implementierung im Backend ab.

Zum Beispiel liest PHP $_POST und $_GET. Es liegt ganz beim Programmierer, was genau durch das Lesen von Variablen aus diesen Arrays gemacht wird.

3voto

maaartinus Punkte 42477

Also, welche sollte verwendet werden, um eine Ressource zu erstellen? Oder muss man beide unterstützen?

Sie sollten PATCH verwenden. Sie patchen die Liste der Fragen wie

PATCH /questions HTTP/1.1

mit einer Liste, die Ihr zu erstellendes Objekt enthält, wie

[
    {
        "title": "Ich sagte Semantik!",
        "content": "Ist das ernst?",
        "answer": "Nicht wirklich"
    }
]

Es ist ein PATCH-Request, da

  • Sie die vorhandene Liste von Ressourcen ändern, ohne den gesamten neuen Inhalt anzugeben
  • Sie den Zustand Ihrer neuen Frage von nicht existierend auf existierend ändern, ohne alle Daten anzugeben (der Server wird höchstwahrscheinlich eine id hinzufügen).

Ein großer Vorteil dieser Methode ist, dass Sie mehrere Entitäten mit nur einer Anfrage erstellen können, indem Sie sie alle in der Liste bereitstellen.

Das ist etwas, das PUT offensichtlich nicht kann. Sie könnten POST verwenden, um mehrere Entitäten zu erstellen, da es das Allzweckwerkzeug von HTTP ist und im Grunde alles kann.

Ein Nachteil ist, dass wahrscheinlich niemand PATCH auf diese Weise verwendet. Ich befürchte, ich habe es nur erfunden, aber ich hoffe, dass ich eine gute Argumentation geliefert habe.

Sie könnten stattdessen CREATE verwenden, da benutzerdefinierte HTTP-Verben erlaubt sind, es ist nur so, dass sie möglicherweise nicht mit einigen Tools funktionieren.

In Bezug auf die Semantik ist CREATE meiner Meinung nach die einzig richtige Wahl, alles andere passt nicht. Leider haben wir nur runde Löcher.

0 Stimmen

Ich denke, du solltest vorsichtig sein, wenn du sagst, dass PATCH ohne klärende Aussagen verwendet werden sollte. PATCH ist großartig für die Aktualisierung von Ressourcen, aber es ist nicht für das Erstellen von Ressourcen gedacht. Die HTTP-Spezifikationen weisen explizit darauf hin, dass es nur für die Aktualisierung von Ressourcen gedacht ist. Du kannst alles so machen, wie du gesagt hast, aber die Verben verlieren ihre Bedeutung, wenn du ihnen willkürlich eine nicht standardmäßige Funktionalität gibst.

0 Stimmen

@Jitsusama Lies meinen vorletzten Satz.... und vielleicht such mal nach diesem "Es ist wie der Versuch, ein Programmierparadigma aus den Steuerbits des TCP-Paket-Headers herauszubekommen! Wenn URG hoch ist, dann ist mein Kalendereintrag sehr wichtig. Wenn ACK niedrig ist, dann lehne ich deine Freundesanfrage ab.".

0 Stimmen

Ich glaube, das ist keine gute Idee. Grundsätzlich wird, wenn man das Einfügen in eine Liste als Patch bezeichnet, alles zu einem Patch: Einfügen, Aktualisieren, sogar Löschen. Dies löst nicht das Problem, sondern fügt tatsächlich eine weitere Unklarheit hinzu.

3voto

Zusatz zu allen oben genannten Antworten:


Am häufigsten in der beruflichen Praxis verwendet,


  • wir verwenden PUT vor POST in der ERSTELLUNG Operation. Warum? Weil viele hier auch gesagt haben, dass Antworten nicht zwischengespeichert werden können, während POST dies möglich ist (erfordern Content-Location und Ablaufzeit).
  • Wir verwenden POST vor PUT in der AKTUALISIERUNG Operation. Warum? Weil es zwischengespeicherte Kopien der gesamten enthaltenen Ressource ungültig macht, was hilfreich ist, wenn Ressourcen aktualisiert werden.

2voto

Charles Derek Punkte 15

Auf die einfachste erklärte Weise:

POST macht, was es sagt, POST bedeutet, dass es eine Anfrage zur Erstellung eines neuen Objekts darstellt. MDN bezeichnet dies als 'andere Seiteneffekte', ein Beispiel wäre die Inkrementierung von Indizes (Was das Wort 'POST' impliziert).

PUT kann als Aktualisierung vorhandener Datenobjekte betrachtet werden, Wenn Leute sagen, dass es für das Hinzufügen von Elementen verwendet werden kann. Dies liegt daran, dass es leere Kinder-null-Werte eines vorhandenen Elternobjekts aktualisieren kann.

MDN Methode PUT Dokumentation

1 Stimmen

Der Grund, warum das alles ein wenig verwirrend ist, liegt darin, dass das Wort POST keine klare Bedeutung angibt oder auch nur suggeriert - ganz sicher nichts über "NEU". Daher bin ich von Ihrem ersten Satz, der uns sagt, dass das Wort POST tut, was es sagt, verwirrt.

0 Stimmen

Was Menschen verwirrt, ist, dass "Putting something" bedeuten kann, "Posting" (aber nicht umgekehrt). Als Substantiv ergibt es keinen Sinn, aber nur in der Verbtense macht es Sinn. Wenn man darüber nachdenkt, wie man die Methode in ein HTML-Formular einfügt, muss man eine Aktion und eine Methode hinzufügen (beides sind Handlungen und Verben). Die Aktion, einen Zettel an ein Brett zu kleben, bedeutet, dass man etwas Neues dort platziert und nicht etwas Bestehendes bearbeitet. Ich kann mich daran erinnern, dass selbst in früheren Zeiten JavaScript Junioren mit Java verwechselte, weil die Wortwahl missverständlich war, als es herauskam. Es ist selten, dass ein Wort in der Programmierung nicht implizit ist, lol.

1voto

Ahmad Ismail Punkte 8416

Vom Aussehen her sind POST und PUT gleich. Es gibt jedoch einige Unterschiede.

In HTTP Essentials: Protokolle für sichere, skalierbare Websites, sagt der Autor:

Der Unterschied zwischen POST und PUT liegt darin, wie der Server den Uniform Resource Identifier interpretiert. Bei einem POST identifiziert der URI ein Objekt auf dem Server, das die enthaltene Daten verarbeiten kann. Bei einem PUT identifiziert der URI hingegen ein Objekt, in dem der Server die Daten ablegen soll. Während ein POST-URI im Allgemeinen auf ein Programm oder Skript hinweist, ist der PUT-URI in der Regel der Pfad und der Name für eine Datei.

Der Autor empfiehlt, PUT zum Hochladen von Dateien zu verwenden, nicht POST. POST ist zum Absenden von Formularen gedacht.

Wenn die GET-, HEAD-, PUT- und DELETE-Methode korrekt implementiert sind, sind sie idempotent, nicht jedoch die POST-Methode. Wenn Sie also zweimal PUT verwenden, erhalten Sie einen neuen Datensatz, wenn Sie jedoch zweimal POSTs verwenden, erhalten Sie zwei neue Datensätze.

Bitte beachten Sie jedoch, dass HTML-Formulare nur GET und POST als HTTP-Anforderungsmethoden unterstützen.

ist ungültiges HTML und wird wie behandelt, d. h. es wird eine GET-Anfrage gesendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X