Was sind die besten / häufigsten RESTful-URL-Verben und -Aktionen?

85

Ich versuche, Informationen zu den besten und häufigsten RESTful-URL-Aktionen zu finden.

Welche URL verwenden Sie beispielsweise zum Anzeigen der Details eines Elements, zum Bearbeiten des Elements, zum Aktualisieren usw.

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

hmm. danke an alle, die mithelfen :)

Pure.Krome
quelle

Antworten:

172

Verwenden Sie URLs, um Ihre Objekte und nicht Ihre Aktionen anzugeben:

Beachten Sie, dass das, was Sie zuerst erwähnt haben, nicht RESTful ist:

/questions/show/<whatever>

Stattdessen sollten Sie Ihre URLs verwenden, um Ihre Objekte anzugeben:

/questions/<question>

Anschließend führen Sie eine der folgenden Operationen für diese Ressource aus.


BEKOMMEN:

Wird verwendet, um eine Ressource abzurufen, eine Liste von Ressourcen abzufragen und um schreibgeschützte Informationen zu einer Ressource abzufragen.

So erhalten Sie eine Fragenressource:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

So listen Sie alle Fragenressourcen auf:

GET /questions HTTP/1.1
Host: whateverblahblah.com

POST:

Wird zum Erstellen einer Ressource verwendet.

Beachten Sie, dass Folgendes ein Fehler ist:

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

Wenn die URL noch nicht erstellt wurde, sollten Sie POST nicht verwenden, um sie zu erstellen, während Sie den Namen angeben. Dies sollte zu einem Fehler führen, bei dem die Ressource nicht gefunden wurde, da er noch nicht vorhanden ist. Sie sollten die Ressource zuerst auf den Server stellen. Sie könnten argumentieren, dass Sie durch das Erstellen einer neuen Frage auch die Ressource / question aktualisieren, da jetzt eine weitere Frage in der Liste der Fragen zurückgegeben wird.

Sie sollten Folgendes tun, um mithilfe von POST eine Ressource zu erstellen:

POST /questions HTTP/1.1
Host: whateverblahblah.com

Beachten Sie, dass in diesem Fall der Ressourcenname nicht angegeben wird und der URL-Pfad für neue Objekte an Sie zurückgegeben wird.

LÖSCHEN:

Wird zum Löschen der Ressource verwendet.

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

STELLEN:

Wird verwendet, um eine Ressource zu erstellen oder zu überschreiben, während Sie die Ressourcen-URL angeben.

Für eine neue Ressource:

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

So überschreiben Sie eine vorhandene Ressource:

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

... Ja, sie sind gleich. PUT wird häufig als "Bearbeitungsmethode" bezeichnet. Wenn Sie die gesamte Ressource durch eine leicht geänderte Version ersetzen, haben Sie bearbeitet, welche Clients beim nächsten Mal abgerufen werden.


Verwenden von REST in HTML-Formularen:

Die HTML5-Spezifikation definiert GET und POST für das Formularelement .

Das Attribut content method ist ein Aufzählungsattribut mit den folgenden Schlüsselwörtern und Zuständen:

  • Das Schlüsselwort GET, das dem Status GET zugeordnet ist und die HTTP-GET-Methode angibt.
  • Das Schlüsselwort POST, das dem Status POST zugeordnet ist und die HTTP-POST-Methode angibt.

Technisch gesehen beschränkt sich die HTTP-Spezifikation nicht nur auf diese Methoden. Es steht Ihnen technisch frei, beliebige Methoden hinzuzufügen. In der Praxis ist dies jedoch keine gute Idee. Die Idee ist, dass jeder weiß, dass Sie GET zum Lesen der Daten verwenden. Dies verwirrt die Sache, wenn Sie sich stattdessen für READ entscheiden. Das gesagt...

PATCH:

Dies ist eine Methode, die in einem formalen RFC definiert wurde. Es wurde entwickelt, um zu verwenden, wenn Sie nur eine teilweise Änderung an eine Ressource senden möchten. Es wird ähnlich wie PUT verwendet:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Der Unterschied besteht darin, dass PUT die gesamte Ressource senden muss, egal wie groß sie im Vergleich zu den tatsächlich geänderten Ressourcen ist, während PATCH nur die Änderungen senden kann .

Brian R. Bondy
quelle
Hallo Brian .. je mehr ich das lese, desto mehr macht es Sinn. Ich gehe davon aus, dass einige Browser (oder Browserversionen) PUT oder DELETE nicht unterstützen. Wenn dies der Fall ist, verwenden wir stattdessen POST?
Pure.Krome
1
Hi Pure.Knome; Webbrowser unterstützen sie alle, auch jede HTTP-Bibliothek sollte sie alle unterstützen.
Brian R. Bondy
4
Ich würde übrigens empfehlen, dieses Buch zu kaufen, wenn Sie alles über REST oreilly.com/catalog/9780596529260
Brian R. Bondy
1
@Brian: Noch ein paar Fragen zu deinen PUT-Beispielen. >> PUT / Fragen / <Neue_Frage> Warum sollten Sie das tun, anstatt >> PUT / Fragen / zu tun, weil alle Daten im Formular zum Erstellen der neuen Ressource verwendet werden? (Fortsetzung nächster Kommentar) ...
Pure.Krome
1
@ Brian R. Bondy, Danke für deine tolle Antwort. Die POST-Anforderung an eine vorhandene Ressource wird in oreillys ruhigem Buch (S. 100, 101) als "Anhängen" beschrieben, entgegen Ihrem allgemeinen Begriff "Ändern". Schließlich ist das Anhängen spezifischer als das Ändern - was möglicherweise "PUT an eine vorhandene Ressource" übermittelt - und klingt für POST semantisch korrekter - Hinzufügen einer neuen Ressource zum angegebenen Link, entweder durch Anhängen an oder Erstellen einer untergeordneten Ressource .
Özgür
11

Angenommen, es /questions/10handelt sich um eine gültige Frage, dann wird die Methode verwendet, um mit ihr zu interagieren.

POST, um es hinzuzufügen

PUT zum Erstellen oder Ersetzen

GET, um es anzuzeigen / abzufragen

und LÖSCHEN zu gut .. löschen Sie es.

Die URL ändert sich nicht.

Allain Lalonde
quelle
4
Falsch. PUT muss idempotent sein. Sie müssen in der Lage sein, dieselbe PUT-Anforderung viele Male ohne Auswirkung nach dem ersten Mal zu stellen. Das Erstellen einer Ressource mit jeder PUT-Anforderung ist also nicht idempotent.
Aehlke
3
"Die Methoden PUT und DELETE sind als idempotent definiert. Dies bedeutet, dass mehrere identische Anforderungen den gleichen Effekt haben sollten wie eine einzelne Anforderung." Durch die Verwendung von put an einem URI, der derzeit keine Ressource verfügbar macht, kann eine Ressource erstellt werden. Sofortiges erneutes Setzen würde es einfach wieder tun, was keine Auswirkung hätte. Auf diese Weise erstellen Sie eine Ressource, aber die Abfrage ist immer noch idempotent. Wenn Sie später zurückkommen und die Ressource ändern möchten, stellen Sie PUT auf denselben URI mit unterschiedlichen Daten (dies wäre eine andere Anforderung und könnte selbst beliebig oft mit demselben Ergebnis wiederholt werden).
Allain Lalonde
1
Werfen Sie einen Blick auf die Antwort, die 25 Stimmen erhalten hat. Es heißt, dass PUT zum Erstellen oder Ersetzen einer Ressource verwendet werden kann.
Allain Lalonde
3
Die Erstellung funktioniert nur, solange die Angabe der ID einer neuen Ressource zulässig ist. Während das möglich ist, ist es für den Benutzer häufiger bequemer, auf / collection zu POSTEN und Links zurückzugeben, die die neue ID enthalten:
pgraham
2
@aehIke Die Erstellung einer neuen Ressource durch PUT macht sie nicht nicht idempotent, da die Idee ist, dass wenn ich 'PUT / items / 10' und Item 10 vorher nicht existierte, sie einfach erstellt wird. Wenn ich jedoch zum zweiten Mal 'PUT / items / 10' erneut verwende, ist es bereits vorhanden, sodass es nur ersetzt wird, sodass die Idempotenz erhalten bleibt, da nachfolgende PUT-Anforderungen keine neuen Nebenwirkungen haben. (Das setzt natürlich
voraus
3

Ich werde auf die Nerven gehen und vermuten, dass Sie, was Sie meinen, Standard-Controller für MVC sind, wenn Sie "RESTful" -URLs sagen, da Ihre Beispiele als nicht "RESTful" angesehen werden könnten (siehe dies) Artikel).

Da Rails den URL-Stil, an dem Sie interessiert zu sein scheinen, wirklich populär gemacht hat, biete ich nachfolgend die Standard-Controller-Aktionen an, die vom ScaffoldingGenerator in Ruby on Rails erstellt wurden. Diese sollten jedem bekannt sein, der eine Rails-Anwendung verwendet.

Die Aktionen und Ansichten auf dem Gerüst sind: Indexieren, Auflisten, Anzeigen, Neu, Erstellen, Bearbeiten, Aktualisieren, Zerstören

Normalerweise konstruieren Sie dies wie folgt:

http://application.com/controller/<action>/<id>
Tvanfosson
quelle
5
Out-of-Band-URI-Konventionen sind NICHT RESTful. Zitat von Fielding selbst: "Eine REST-API darf keine festen Ressourcennamen oder -hierarchien definieren (eine offensichtliche Kopplung von Client und Server). Server müssen die Freiheit haben, ihren eigenen Namespace zu steuern. Stattdessen dürfen Server Clients anweisen, wie geeignete URIs erstellt werden , wie es in HTML-Formularen und URI-Vorlagen geschieht, indem diese Anweisungen innerhalb von Medientypen und Verknüpfungsbeziehungen definiert werden. "
aehlke
1

Hier ist eine Zuordnung Ihrer aktuellen URLs nach dem REST-Prinzip:

/question/show/<whatever>

Wenn Sie die Frage als Ressource identifizieren, sollte sie eine eindeutige URL haben. Die Verwendung von GET zum Anzeigen (Abrufen) ist die gängige Praxis. Es wird:

GET /question/<whatever>

/question/edit/<whatever>

Jetzt möchten Sie, dass Ihr Benutzer eine andere Ansicht derselben Ressource hat, mit der er die Ressource bearbeiten kann (möglicherweise mit Formularsteuerelementen).

Zwei Optionen: Ihre Anwendung ist eine Anwendung (keine Website). Dann verwenden Sie möglicherweise besser JavaScript, um die Ressource auf der Clientseite in eine bearbeitbare Ressource umzuwandeln.

Wenn es sich um eine Website handelt, können Sie dieselbe URL mit zusätzlichen Informationen verwenden, um eine andere Ansicht anzugeben. Die gängige Vorgehensweise scheint folgende zu sein:

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

Dies dient dazu, die Frage zu ändern, sodass PUT die richtige Methode ist:

PUT /question/<whatever>

/question/list   (lists the questions)

Die Liste der Fragen ist eigentlich die übergeordnete Ressource einer Frage, daher ist es natürlich:

GET /question

Jetzt brauchen Sie vielleicht noch etwas:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

Tada :)

Vincent Robert
quelle
-1

Ihre vier Beispiele könnten sein:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

So fügen Sie eine Frage hinzu:

POST /questions q=What+is+the+meaning+of+life

Der Server würde antworten:

200 OK (or 201 Created)
Location: /questions/456
pbreitenbach
quelle