Welche HTTP-Methoden passen zu welchen CRUD-Methoden?

213

Bei der Programmierung im RESTful-Stil sollten wir HTTP-Methoden als Bausteine ​​verwenden. Ich bin allerdings etwas verwirrt, welche Methoden zu den klassischen CRUD-Methoden passen. GET / Read und DELETE / Delete sind offensichtlich genug.

Was ist jedoch der Unterschied zwischen PUT / POST? Stimmen sie eins zu eins mit Erstellen und Aktualisieren überein?

Drew
quelle

Antworten:

298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT kann abhängig vom Vorhandensein des mit dem PUT verwendeten URI sowohl Erstellen als auch Aktualisieren zugeordnet werden.

POST-Karten zum Erstellen.

Korrektur: POST kann auch Update zugeordnet werden, obwohl es normalerweise für Erstellen verwendet wird. POST kann auch eine teilweise Aktualisierung sein, sodass wir die vorgeschlagene PATCH-Methode nicht benötigen.

Paul Morgan
quelle
16
+1: Die Unterscheidung zwischen PUT zum Erstellen von Ressourcen, deren Namen (URIs) vom Client zugewiesen werden, und POST zum Erstellen von Ressourcen, deren Namen vom Server zugewiesen werden, ist wichtig. Weitere Informationen finden Sie unter Richardson und Rubys Restful Web Services (O'Reilly).
Jim Ferrans
9
Und da PUT und DELETE von Webbrowsern noch nicht unterstützt werden, wird es als in Ordnung angesehen, POST zu "überladen", indem ein Abfragezeichenfolgenargument wie method = PUT oder method = DELETE zum zu postenden URI hinzugefügt wird.
Jim Ferrans
2
Schöne Analysen jcalcote.wordpress.com/2008/10/16/…
Boris Ivanov
13
@ JimFerrans PUT und DELETE werden von Webbrowsern mit XHR problemlos unterstützt. Im Kontext von HTML-Formularen werden sie jedoch von der HTML-Spezifikation nicht unterstützt, sodass Browser dies auch nicht können.
Eis
3
Während kanonisch nicht in CRUD auf einen Brief abbildet, GET / Einheit / zu viele REST - Frameworks auch verwenden Liste Einheiten des Typs Entität . GET / entity / id liest die bestimmte Entität, die mit der ID übereinstimmt .
Toddius Zho
49

Der ganze Schlüssel ist, ob Sie eine machen idempotente Änderung vornehmen oder nicht. Das heißt, wenn das zweimalige Ergreifen der Nachricht dazu führt, dass „dasselbe“ vorhanden ist, als ob es nur einmal ausgeführt worden wäre, haben Sie eine idempotente Änderung und sie sollte PUT zugeordnet werden. Wenn nicht, wird es dem POST zugeordnet. Wenn Sie dem Client niemals erlauben, URLs zu synthetisieren, ist PUT ziemlich nah an Update und POST kann Create problemlos verarbeiten, aber dies ist mit Sicherheit nicht die einzige Möglichkeit, dies zu tun. Wenn der Client weiß, dass er /foo/abcInhalte erstellen möchte und weiß, welche Inhalte dort abgelegt werden sollen, funktioniert dies einwandfrei als PUT.

Die kanonische Beschreibung eines POST lautet, wenn Sie sich zum Kauf von etwas verpflichten: Dies ist eine Aktion, die niemand wiederholen möchte, ohne es zu wissen. Im Gegensatz dazu kann die vorherige Einstellung der Versandadresse für die Bestellung mit PUT problemlos erfolgen: Es spielt keine Rolle, ob Sie 6 Anywhere Dr, Nowherevilleeinmal, zweimal oder hundertmal zum Senden aufgefordert werden: Es ist immer noch dieselbe Adresse. Bedeutet das, dass es sich um ein Update handelt? Könnte sein ... Es hängt alles davon ab, wie Sie das Backend schreiben möchten. (Beachten Sie, dass die Ergebnisse möglicherweise nicht identisch sind: Sie können dem Benutzer melden, wann er zuletzt einen PUT als Teil der Darstellung der Ressource durchgeführt hat, um sicherzustellen, dass wiederholte PUTs kein identisches Ergebnis verursachen, das Ergebnis jedoch weiterhin im funktionalen Sinne „gleich“ sein.)

Donal Fellows
quelle
1
Diese Unterscheidung zwischen den Anwendungsfällen für POSTund PUTist interessant und sollte die Antwort auf "Was ist 'erstellen' und was ist 'aktualisieren'?" so viel klarer. In Bezug auf die Implementierung der API würde sich daraus ergeben, dass eine Wiederholung PUTein stilles No-Op darstellen sollte, während eine Wiederholung POSTeine Ausnahme auslösen könnte, wenn ein Aspekt der gesendeten Daten im Datenspeicher eindeutig bleiben soll das unterstützt die Anwendung.
Nullbandbreite
2
Diese Antwort und der folgende Kommentar werfen einen wichtigen Punkt auf, dass Vorsicht geboten ist, wenn CRUD eng (1 zu 1) mit der HTTP-REST-Semantik gleichgesetzt wird. Dies ist keine kanonische Zuordnung.
Martin Spamer
35

Ich habe nach der gleichen Antwort gesucht, hier ist, was IBM sagt. IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
quelle
10

Derzeit (2016) sind die neuesten HTTP-Verben GET, POST, PATCH , PUT und DELETE

Überblick

  • HTTP GET - SELECT / Request
  • HTTP PUT - UPDATE
  • HTTP POST - INSERT / Create
  • HTTP PATCH - Beim PUT ting ist eine vollständige Ressourcendarstellung umständlich und beansprucht mehr Bandbreite, z. B.: Wenn Sie eine Spalte teilweise aktualisieren müssen
  • HTTP DELETE - DELETE

Hoffe das hilft!

Wenn Sie daran interessiert sind, REST-APIs zu entwerfen, ist dies eine gute Lektüre! Website Online-Version Github Repository

d1jhoni1b
quelle
1
Beachten Sie ab dem 18. Februar, dass PATCH in Client- und Serverbibliotheken nicht vollständig implementiert ist.
Dizzley
oh ok danke ich verstehe ... würde es dir etwas ausmachen einen Link / eine Referenz zu posten, damit ich bitte einen Blick darauf werfen kann?
d1jhoni1b
9

Es gibt ein großartiges Youtube-Videogespräch von Stormpath, das dies tatsächlich erklärt. Die URL sollte zum richtigen Teil des Videos springen:

Sturmpfad Youtube Video

Es lohnt sich auch zu sehen, dass es mehr als eine Stunde dauert, aber sehr interessant, wenn Sie daran denken, Zeit in den Aufbau einer REST-API zu investieren.

pleshy
quelle
7

Es kommt auf die konkrete Situation an .. aber im Allgemeinen:

PUT = Aktualisieren oder Ändern einer konkreten Ressource mit einem konkreten URI der Ressource.

POST = Erstellen Sie eine neue Ressource unter der Quelle des angegebenen URI.

Dh

Bearbeiten Sie einen Blog-Beitrag:

PUT: / blog / entry / 1

Erstellen Sie eine neue:

POST: / blog / entry

PUT kann unter bestimmten Umständen eine neue Ressource erstellen, wenn der URI der neuen Ressource vor der Anforderung klar ist. POST kann auch verwendet werden, um mehrere andere Anwendungsfälle zu implementieren, die von den anderen nicht abgedeckt werden (GET, PUT, DELETE, HEAD, OPTIONS).

Das allgemeine Verständnis für CRUD-Systeme lautet GET = Anfrage, POST = Erstellen, Put = Aktualisieren, DELETE = Löschen

Stecken
quelle
4

Die Bausteine ​​von REST sind hauptsächlich die Ressourcen (und URI) und die Hypermedien. In diesem Zusammenhang GETist dies der Weg, um eine Darstellung der Ressource zu erhalten (die tatsächlich SELECTin CRUD-Begriffen einer zugeordnet werden kann).

Sie sollten jedoch nicht unbedingt eine Eins-zu-Eins-Zuordnung zwischen CRUD-Operationen und HTTP-Verben erwarten. Der Hauptunterschied zwischen PUTund POSTliegt in ihrer idempotenten Eigenschaft. POSTwird auch häufiger für Teilaktualisierungen verwendet, wiePUT Allgemeinen eine vollständige neue Darstellung der Ressource gesendet wird.

Ich würde vorschlagen, dies zu lesen:

Die HTTP-Spezifikation ist auch eine nützliche Referenz:

Die PUT-Methode fordert an, dass die eingeschlossene Entität unter dem angegebenen Anforderungs-URI gespeichert wird.

[...]

Der grundlegende Unterschied zwischen den POST- und PUT-Anforderungen spiegelt sich in der unterschiedlichen Bedeutung des Anforderungs-URI wider. Der URI in einer POST-Anforderung gibt die Ressource an, die die eingeschlossene Entität verarbeitet. Diese Ressource kann ein Datenakzeptanzprozess, ein Gateway zu einem anderen Protokoll oder eine separate Entität sein, die Anmerkungen akzeptiert. Im Gegensatz dazu identifiziert der URI in einer PUT-Anforderung die der Anforderung beigefügte Entität. Der Benutzeragent weiß, welcher URI beabsichtigt ist, und der Server darf NICHT versuchen, die Anforderung auf eine andere Ressource anzuwenden. Wenn der Server möchte, dass die Anforderung auf einen anderen URI angewendet wird,

Bruno
quelle
3

Im Allgemeinen ist dies das Muster, das ich verwende:

  • HTTP GET - SELECT / Request
  • HTTP PUT - UPDATE
  • HTTP POST - INSERT / Create
  • HTTP DELETE - DELETE
AJ.
quelle
5
PUT und POST stimmen nicht genau mit Update oder Create überein. PUT ist "gesetzt" (dh wenn Sie den Ressourcennamen vorher kennen und den zu verwendenden Wert angeben) und POST ist alles andere. Der Schlüssel ist zu überlegen, ob das, was Sie tun, ist idempotent ist oder nicht.
Donal Fellows
1
+1 auf den Kommentar. Die Annahme einer absoluten Zuordnung zwischen beiden kann irreführend sein. Eine HTTP-DELETE-Operation für einen URI kann beispielsweise einfach einen serverseitigen Datensatz so ändern (dh aktualisieren), dass eine HTTP-GET-Operation für keine Darstellung mehr zurückgibt.
Stand
4
PUT und POST stimmen nicht genau mit Update oder Create überein . Stimmt, aber AJ hat beschrieben, welches Muster er verwendet.
Piotr Dobrogost
1

Das Symfony- Projekt versucht, seine HTTP-Methoden mit CRUD-Methoden verknüpft zu halten, und ihre Liste ordnet sie wie folgt zu:

  • GET Ruft die Ressource vom Server ab
  • POST Erstellen Sie eine Ressource auf dem Server
  • PUT Aktualisieren Sie die Ressource auf dem Server
  • LÖSCHEN Löschen Sie die Ressource vom Server

Es ist erwähnenswert, dass, wie sie auf dieser Seite sagen: "In Wirklichkeit unterstützen viele moderne Browser die PUT- und DELETE-Methoden nicht."

Soweit ich mich erinnere, "fälscht" Symfony PUT und DELETE für diejenigen Browser, die sie beim Generieren ihrer Formulare nicht unterstützen, um zu versuchen, der theoretisch korrekten HTTP-Methode so nahe wie möglich zu kommen, auch wenn ein Browser dies nicht unterstützt es.

Matt Gibson
quelle