Frage PUT vs. POST in REST


Gemäß der HTTP / 1.1 Spezifikation:

Das POST Englisch: www.weisang.info/index.php?id=143&t...h=cfd8d8dcdb Mit der Methode wird angefordert, dass der Ursprungsserver die in der Anfrage eingeschlossene Entität als neuen Untergebenen der von der Ressource identifizierten Ressource akzeptiert Request-URI in dem Request-Line

Mit anderen Worten, POST wird benutzt um erstellen.

Das PUT Methode fordert an, dass die eingeschlossene Entität unter dem gelieferten gespeichert wird Request-URI. Wenn die Request-URI bezieht sich auf eine bereits vorhandene Ressource, die eingeschlossene Entität sollte als eine modifizierte Version der auf dem Ursprungsserver befindet betrachtet werden. Wenn die Request-URI verweist nicht auf eine vorhandene Ressource, und dieser URI kann vom anfordernden Benutzeragenten als neue Ressource definiert werden, der Ursprungsserver kann die Ressource mit diesem URI erstellen. "

Das ist, PUT wird benutzt um erstellen oder aktualisieren.

Also, mit welcher sollte man eine Ressource erstellen? Oder muss man beides unterstützen?


4456
2018-03-10 14:25


Ursprung


Antworten:


Insgesamt: 

Sowohl PUT als auch POST können zum Erstellen verwendet werden.

Sie müssen fragen: "Was machen Sie mit der Aktion?" um zu unterscheiden, was Sie verwenden sollten. Angenommen, Sie entwickeln eine API, um Fragen zu stellen. Wenn Sie POST verwenden möchten, würden Sie das zu einer Liste von Fragen machen. Wenn Sie PUT verwenden möchten, würden Sie das für eine bestimmte Frage tun.

Großartig kann beides verwendet werden, also welches sollte ich in meinem RESTful Design verwenden:

Sie müssen nicht sowohl PUT als auch POST unterstützen.

Welches verwendet wird, bleibt Ihnen überlassen. Aber denken Sie daran, das richtige zu verwenden, abhängig davon, auf welches Objekt Sie in der Anfrage verweisen.

Einige Überlegungen:

  • Benennen Sie Ihre URL-Objekte, die Sie explizit erstellen, oder lassen Sie den Server entscheiden? Wenn Sie sie benennen, verwenden Sie PUT. Wenn Sie den Server entscheiden lassen, verwenden Sie POST.
  • PUT ist idempotent. Wenn Sie also ein Objekt zweimal PUT setzen, hat es keine Wirkung. Dies ist eine nette Eigenschaft, also würde ich PUT verwenden, wenn möglich.
  • Sie können eine Ressource mit PUT mit derselben Objekt-URL aktualisieren oder erstellen
  • Mit POST können Sie zwei Anfragen haben, die gleichzeitig Änderungen an einer URL vornehmen, und sie können verschiedene Teile des Objekts aktualisieren.

Ein Beispiel:

Ich schrieb das folgende als Teil einer anderen Antwort auf SO diesbezüglich:

POST:

Wird zum Ändern und Aktualisieren einer Ressource verwendet

POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/

Beachten Sie, dass Folgendes ein Fehler ist:

POST /questions/<new_question> HTTP/1.1
Host: www.example.com/

Wenn die URL noch nicht erstellt wurde,   sollte nicht POST verwenden, um es zu erstellen   während Sie den Namen angeben. Das sollte   Ergebnis in einem Fehler "Ressource nicht gefunden"   weil <new_question> ist nicht vorhanden   noch. Sie sollten die <new_question>   Ressource auf dem Server zuerst.

Du könntest so etwas tun   um mit POST eine Ressource zu erstellen:

POST /questions HTTP/1.1
Host: www.example.com/

Beachten Sie, dass in diesem Fall die Ressource   Name ist nicht angegeben, die neuen Objekte   Der URL-Pfad wird an Sie zurückgegeben.

STELLEN: 

Wird verwendet, um eine Ressource zu erstellen, oder   überschreibe es. Während Sie die angeben   Ressourcen neue URL.

Für eine neue Ressource:

PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/

So überschreiben Sie eine vorhandene Ressource:

PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/

3480
2018-03-10 14:29



Sie können Behauptungen im Internet finden, die sagen

Beides stimmt nicht.


Besser ist es zwischen PUT und POST zu wählen Idempotenz der Aktion.

STELLEN impliziert, eine Ressource zu setzen, die alles, was an der gegebenen URL verfügbar ist, durch eine andere Sache ersetzt. Per Definition ist ein PUT idempotent. Mach es so oft du willst und das Ergebnis ist das gleiche. x=5 ist idempotent. Sie können eine Ressource PUT einfügen, unabhängig davon, ob sie bereits existiert oder nicht (z. B. zum Erstellen oder Aktualisieren)!

POST aktualisiert eine Ressource, fügt eine Hilfsressource hinzu oder bewirkt eine Änderung. Ein POST ist nicht idempotent, in der Art und Weise x++ ist nicht idempotent.


Mit diesem Argument wird PUT erstellt, wenn Sie die URL der zu erstellenden Sache kennen. POST kann verwendet werden, wenn Sie die URL der "Factory" oder des Managers für die Kategorie von Dingen, die Sie erstellen möchten, kennen.

damit:

POST /expense-report

oder:

PUT  /expense-report/10929

1878
2018-04-22 14:55



  • POST an eine URL Erstellt eine untergeordnete Ressource an einer Server definiert URL
  • STELLEN an eine URL erstellt / ersetzt die Ressource in seiner Gesamtheit bei der Kunde definiert URL
  • PATCH an eine URL Aktualisierung Teil der Ressource bei dieser Client definierten URL.

Die relevante Spezifikation für PUT und POST ist RFC 2616 §9.5ff.

POST erstellt eine untergeordnete Ressource, so nach /items schafft eine Ressourcen, die unter der lebt /items Ressource. Z.B. /items/1. Wenn Sie dasselbe Postpaket zweimal senden, werden zwei Ressourcen erstellt.

STELLEN dient zum Erstellen oder Ersetzen einer Ressource bei a URL, die vom Client bekannt ist.

Deshalb: STELLEN ist nur ein Kandidat für CREATE, wo der Client die URL bereits kennt, bevor die Ressource erstellt wird. Z.B. /blogs/nigel/entry/when_to_use_post_vs_put Der Titel wird als Ressourcenschlüssel verwendet

STELLEN Ersetzt die Ressource an der bekannten URL, wenn sie bereits vorhanden ist. Daher hat das zweimalige Senden derselben Anforderung keine Auswirkung. Mit anderen Worten, Anrufe zu PUT sind idempotent.

Der RFC liest sich so:

Der grundlegende Unterschied zwischen den Anforderungen POST und PUT spiegelt sich in der unterschiedlichen Bedeutung des Request-URI wider. Der URI in einer POST-Anforderung identifiziert die Ressource, die die eingeschlossene Entität verarbeiten wird. Diese Ressource kann ein Daten akzeptierender Prozess, ein Gateway zu einem anderen Protokoll oder eine separate Entität sein, die Annotationen akzeptiert. Im Gegensatz dazu identifiziert der URI in einer PUT-Anforderung die Entität, die der Anforderung beigefügt ist - der Benutzeragent weiß, welcher URI gemeint ist, und der Server darf NICHT versuchen, die Anforderung auf eine andere Ressource anzuwenden. Wenn der Server wünscht, dass die Anforderung auf einen anderen URI angewendet wird,

Hinweis: PUT wurde hauptsächlich verwendet, um Ressourcen zu aktualisieren (indem sie in ihrer Gesamtheit ersetzt wurden), aber in letzter Zeit gibt es Bewegung in Richtung der Verwendung von PATCH zum Aktualisieren existierender Ressourcen, da PUT angibt, dass es die gesamte Ressource ersetzt. RFC 5789.


562
2018-04-07 05:52



Zusammenfassung:

Erstellen:

Kann mit PUT oder POST auf folgende Weise ausgeführt werden:

STELLEN

Erstellt DAS neue Ressource mit neueResourceId als Bezeichner unter dem / resources URI oder Sammlung.

PUT /resources/<newResourceId> HTTP/1.1 

POST

Erstellt EIN neue Ressource unter dem / resources URI, oder Sammlung. Normalerweise wird die Kennung vom Server zurückgegeben.

POST /resources HTTP/1.1

Aktualisieren:

Kann nur mit PUT auf folgende Weise durchgeführt werden:

STELLEN

Aktualisiert die Ressource mit existingResourceId als Bezeichner unter dem / resources URI oder Sammlung.

PUT /resources/<existingResourceId> HTTP/1.1

Erläuterung:

Wenn Sie REST und URI als allgemein behandeln, haben Sie generisch auf der links und Spezifisch auf der Recht. Das Generika werden normalerweise genannt Sammlungen und desto mehr Spezifisch Gegenstände können angerufen werden Ressource. Beachten Sie, dass a Ressource kann enthalten a Sammlung.

Beispiele:

<- generisch - spezifisch ->

URI: website.com/users/john
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource

URI:website.com/users/john/posts/23
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource
posts        - collection of posts from john
23           - post from john with identifier 23, also a resource

Wenn Sie POST verwenden, sind Sie immer Bezug auf a SammlungWenn du also sagst:

POST /users HTTP/1.1

Sie veröffentlichen einen neuen Benutzer in der Benutzer  Sammlung.

Wenn Sie weitermachen und so etwas versuchen:

POST /users/john HTTP/1.1

Es wird funktionieren, aber semantisch sagen Sie, dass Sie eine Ressource hinzufügen möchten John  Sammlung unter dem Benutzer  Sammlung.

Sobald Sie PUT verwenden, beziehen Sie sich auf a Ressource oder Einzelstück, möglicherweise in einem Sammlung. Also wenn du sagst:

PUT /users/john HTTP/1.1

Sie sagen dem Server Update, oder erstellen, wenn es nicht existiert, die John  Ressource unter dem Benutzer  Sammlung.

Spezifikation:

Lassen Sie mich einige wichtige Teile der Spezifikation hervorheben:

POST

Das POST Methode wird verwendet, um den Ursprungsserver anzufordern akzeptieren die in der Anfrage eingeschlossene Entität als a Neu untergeordnet der Ressource, die von der Request-URI in der Request-Line identifiziert wird

Erzeugt also ein neues Ressource auf einen Sammlung.

STELLEN

Das STELLEN Methode fragt, dass die eingeschlossene Entität sein soll gelagert unter dem gelieferten Request-URI. Wenn der Anfrage-URI auf ein verweist bereits bestehende Ressource, die eingeschlossene Entität sollte als betrachtet werden modifizierte Version von demjenigen, der auf dem Ursprungsserver liegt. Wenn der Anfrage-URI dies tut nicht auf ein existierendes hinweisen Ressource, und das ist URI fähig als a definiert werden Neu Ressource durch den anfordernden Benutzer-Agent kann der Ursprungsserver erstellen die Ressource mit diesem URI. "

Also, erstellen oder aktualisieren Sie basierend auf der Existenz der Ressource.

Referenz:


165
2017-08-14 22:47



Ich möchte meinen "pragmatischen" Rat hinzufügen. Verwenden Sie PUT, wenn Sie die "ID" kennen, mit der das Objekt, das Sie speichern, abgerufen werden kann. Die Verwendung von PUT funktioniert nicht so gut, wenn Sie beispielsweise eine Datenbank-generierte ID benötigen, die für zukünftige Suchvorgänge oder Aktualisierungen zurückgegeben wird.

Also: Um einen bestehenden Benutzer zu speichern, oder einen, bei dem der Client die ID generiert und überprüft wurde, dass die ID eindeutig ist:

PUT /user/12345 HTTP/1.1  <-- create the user providing the id 12345
Host: mydomain.com

GET /user/12345 HTTP/1.1  <-- return that user
Host: mydomain.com

Andernfalls verwenden Sie POST, um das Objekt zunächst zu erstellen, und PUT, um das Objekt zu aktualisieren:

POST /user HTTP/1.1   <--- create the user, server returns 12345
Host: mydomain.com

PUT /user/12345 HTTP/1.1  <--- update the user
Host: mydomain.com

156
2018-01-15 19:59



POST bedeutet "create new" wie in "Hier ist die Eingabe zum Erstellen eines Benutzers, erstellen Sie es für mich".

PUT bedeutet "einfügen, ersetzen, wenn bereits vorhanden" wie in "Hier sind die Daten für Benutzer 5".

Sie senden an example.com/users, da Sie die URL des Benutzers noch nicht kennen und der Server sie erstellen soll.

Sie haben PUT zu example.com/users/id, da Sie eine ersetzen / erstellen möchten Spezifisch Benutzer.

Wenn Sie zweimal mit denselben Daten POST erstellen, erstellen Sie zwei identische Benutzer mit unterschiedlichen IDs. Wenn Sie zweimal mit den gleichen Daten arbeiten, wird der Benutzer der erste und aktualisiert ihn beim zweiten Mal in denselben Zustand (keine Änderungen). Da Sie nach einem PUT denselben Zustand haben, egal wie oft Sie ihn ausführen, wird gesagt, dass er jedes Mal "gleich stark" ist - idempotent. Dies ist nützlich, um Anfragen automatisch erneut zu versuchen. Nicht mehr "Sind Sie sicher, dass Sie erneut senden möchten", wenn Sie die Zurück-Taste im Browser drücken.

Ein allgemeiner Hinweis ist die Verwendung von POST, wenn der Server die URL-Generierung Ihrer Ressourcen steuern soll. Verwenden Sie PUT andernfalls. Lieber PUT über POST bevorzugen.


145
2017-10-23 14:27



Verwenden Sie POST zum Erstellen und PUT zum Aktualisieren. So macht es Ruby on Rails.

PUT    /items/1      #=> update
POST   /items        #=> create

105
2018-03-10 14:28