PUT vs. POST in REST
Gemäß der HTTP/1.1 Spezifikation:
Die POST
-Methode wird verwendet, um den Ursprungsserver aufzufordern, die in der Anfrage enthaltene Entität als neuen Unterordner der Ressource zu akzeptieren, die durch die Request-URI
in der Request-Line
identifiziert wird.
Mit anderen Worten: "POST" wird zum Erstellen verwendet.
Die Methode PUT
verlangt, dass die eingeschlossene Entität unter der übergebenen Request-URI
gespeichert wird. Bezieht sich die Request-URI
auf eine bereits existierende Ressource, SOLLTE die eingeschlossene Entität als eine modifizierte Version der auf dem Ursprungsserver befindlichen angesehen werden. Wenn die Request-URI
nicht auf eine bereits existierende Ressource verweist und diese URI vom anfragenden User-Agent als neue Ressource definiert werden kann, kann der Ursprungsserver die Ressource mit dieser URI erstellen."
Das heißt, PUT
wird zum Erstellen oder Aktualisieren verwendet.
Welche der beiden Möglichkeiten sollte also zum Erstellen einer Ressource verwendet werden? Oder muss man beides unterstützen?
Insgesamt:
Sowohl PUT als auch POST können zur Erstellung verwendet werden.
Um zu unterscheiden, was Sie verwenden sollten, müssen Sie sich fragen: "Wofür führen Sie die Aktion aus?". Nehmen wir an, Sie entwickeln eine API, um Fragen zu stellen. Wenn Sie POST verwenden möchten, dann würden Sie dies mit einer Liste von Fragen tun. Wenn Sie PUT verwenden möchten, dann würden Sie dies für eine bestimmte Frage tun.
Großartig, beide können verwendet werden, also welche sollte ich in meinem RESTful-Design verwenden:
Sie müssen nicht sowohl PUT als auch POST unterstützen.
Welches verwendet wird, bleibt Ihnen überlassen. Denken Sie aber daran, die richtige zu verwenden, je nachdem, auf welches Objekt Sie in der Anfrage verweisen.
Einige Überlegungen:
Ein Beispiel:
Ich habe das Folgende als Teil einer anderen Antwort auf SO zu diesem Thema geschrieben:
Verwenden Sie POST zum Erstellen und PUT zum Aktualisieren. So wird es jedenfalls in Ruby on Rails gehandhabt.
REST ist ein sehr hochrangiges Konzept. In der Tat wird HTTP nicht einmal erwähnt!
Wenn Sie Zweifel haben, wie REST in HTTP implementiert werden kann, können Sie jederzeit einen Blick auf die Atom Publication Protocol (AtomPub) Spezifikation werfen. AtomPub ist ein Standard für das Schreiben von RESTful Webservices mit HTTP, der von vielen HTTP- und REST-Koryphäen entwickelt wurde, mit einigen Beiträgen von Roy Fielding, dem Erfinder von REST und (Mit-)Erfinder von HTTP selbst.
Vielleicht können Sie AtomPub sogar direkt verwenden. Obwohl es aus der Blogging-Community hervorgegangen ist, ist es keineswegs auf das Blogging beschränkt: Es ist ein allgemeines Protokoll für die REST-Interaktion mit beliebigen (verschachtelten) Sammlungen beliebiger Ressourcen über HTTP. Wenn Sie Ihre Anwendung als eine verschachtelte Sammlung von Ressourcen darstellen können, dann können Sie AtomPub verwenden und müssen sich keine Gedanken darüber machen, ob Sie PUT oder POST verwenden, welche HTTP-Statuscodes zurückgegeben werden sollen und all diese Details.
Dies ist, was AtomPub über die Erstellung von Ressourcen zu sagen hat (Abschnitt 9.2):
Um Mitglieder zu einer Collection hinzuzufügen, senden Clients POST-Anfragen an die URI der Collection.