2008-11-02 9 views
72

Ich versuche, einige Informationen über die besten und häufigsten RESTful URL Aktionen zu finden.Was sind die besten/häufigsten RESTful URL Verben und Aktionen?

zum Beispiel, welche URL verwenden Sie die Details eines Objekts zur Anzeige, für das Element bearbeiten, 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 jeden, der aushilft :)

Antwort

148

Verwenden URLs Ihre Objekte angeben, nicht Ihre Aktionen:

/questions/show/<whatever> 

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

Hinweis, was Sie zuerst nicht RESTful erwähnt ist

/questions/<question> 

Dann führen Sie eine der folgenden Operationen auf dieser Ressource durch.


GET:

verwendet, um eine Ressource zu erhalten, eine Liste von Ressourcen abfragen und auch schreibgeschützte Informationen über eine Ressource abzufragen.

Um eine Frage Ressource zu erhalten:

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

alle Frage Ressourcen aufzulisten:

GET /questions HTTP/1.1 
Host: whateverblahblah.com 

POST:

verwendet, um eine Ressource zu erstellen.

Beachten Sie, dass der folgende Text ist ein Fehler:

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

Wenn die URL noch nicht erstellt wurde, sollten Sie nicht POST verwenden, es zu erstellen, während Sie den Namen angeben. Dies sollte dazu führen, dass eine Ressource nicht gefunden wird, weil sie noch nicht existiert. Sie sollten zuerst die Ressource auf dem Server PUT. Sie könnten argumentieren, dass Sie beim Erstellen einer neuen Frage auch die Ressource/questions aktualisieren, da sie jetzt eine weitere Frage in ihrer Liste von Fragen zurückgibt.

Sie sollten etwas tun, eine Ressource mit POST zu erstellen:

POST /questions HTTP/1.1 
Host: whateverblahblah.com 

Beachten Sie, dass der Ressourcenname in diesem Fall nicht angegeben ist, die neue Objekte URL-Weg würde an Sie zurückgegeben werden.

LÖSCHEN:

verwendet, um die Ressource zu löschen.

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

PUT:

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

Für eine neue Ressource:

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

eine bestehende Ressource zu überschreiben:

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

... Ja, sie sind die gleichen. PUT wird oft als "Edit" -Methode bezeichnet, da Sie durch das Ersetzen der gesamten Ressource durch eine leicht geänderte Version bearbeitet haben, was die Clients bei der nächsten Ausführung erhalten.


Mit REST in HTML-Formularen:

Die HTML5 spec defines GET and POST for the form element.

The method content attribute is an enumerated attribute with the following keywords and states:

  • The keyword GET, mapping to the state GET, indicating the HTTP GET method.
  • The keyword POST, mapping to the state POST, indicating the HTTP POST method.

Technisch ist die HTTP-Spezifikation beschränken Sie sich nicht nur auf diese Methoden. Sie sind technisch frei, irgendwelche Methoden hinzuzufügen, die Sie wünschen, aber in der Praxis ist das keine gute Idee. Die Idee ist, dass jeder weiß, dass Sie GET verwenden, um die Daten zu lesen, so dass es verwirren wird, wenn Sie sich entscheiden, stattdessen READ zu verwenden. Das sagt ...

PATCH:

Dies ist eine Methode, die in einer formalen RFC definiert wurde. Es ist für verwendet, wenn Sie nur eine teilweise Änderung einer Ressource senden wollen, wäre es viel wie PUT verwendet werden:

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

Der Unterschied PUT ist, hat die gesamte Ressource zu senden, egal wie groß es wird verglichen mit dem, was tatsächlich geändert wird, während PATCH nur die Änderungen senden können.

+0

Hi Brian .. je mehr ich das lese, desto mehr macht es Sinn. Ich nehme an, dass einige Browser (oder Browserversionen) PUT oder DELETE nicht unterstützen? Wenn das der Fall ist, verwenden wir stattdessen POST? –

+1

Hallo Pure.Knome; Webbrowser unterstützen sie alle, auch jede HTTP-Bibliothek sollte sie alle unterstützen. –

+4

Ich würde empfehlen, dieses Buch übrigens zu kaufen, wenn Sie alles über REST erfahren möchten http://oreilly.com/catalog/9780596529260/ –

10

Angenommen, /questions/10 ist eine gültige Frage, dann wird die Methode verwendet, um damit zu interagieren.

POST es

PUT hinzufügen zu erstellen oder es

GET ersetzen Sie es sehen/

abzufragen und zu gut DELETE .. löschen.

Die URL ändert sich nicht.

+4

Falsch. PUT muss idempotent sein. Sie müssen in der Lage sein, die gleiche PUT-Anfrage viele Male ohne Wirkung nach dem ersten Mal zu machen. Daher ist das Erstellen einer Ressource mit jeder PUT-Anfrage nicht idempotent. – aehlke

+3

"Die Methoden PUT und DELETE sind als idempotent definiert, was bedeutet, dass mehrere identische Anfragen den gleichen Effekt wie eine einzelne Anfrage haben sollten." Durch die Verwendung von put an einem URI, der derzeit keine Ressource verfügbar macht, kann eine Ressource erstellt werden. Sofort wieder zu putten würde es einfach wieder tun, was keinen Effekt hätte. Auf diese Weise erstellen Sie eine Ressource, die Abfrage ist jedoch weiterhin idempotent.Wenn Sie später zurückkommen und die Ressource ändern möchten, werden Sie mit denselben Daten an den gleichen URI übergeben (was eine andere Anforderung wäre und selbst beliebig oft mit demselben Ergebnis wiederholt werden könnte). –

+1

Werfen Sie einen Blick auf die Antwort, die 25 Stimmen erhalten hat, dass PUT zum Erstellen oder Ersetzen einer Ressource verwendet werden kann. –

3

Ich werde gehen auf einem Bein und denke, dass Sie, was Sie meinen, was sind Standard-Controller für MVC, wenn Sie "RESTful" URLs sagen, da Ihre Beispiele als nicht "RESTful" (siehe this Artikel).

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

The scaffolded actions and views are: index, list, show, new, create, edit, update, destroy

Normalerweise würden Sie dies als Konstrukt:

http://application.com/controller/<action>/<id> 
+5

Out-of-Band-URI-Konventionen sind NICHT RESTful. 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 können Server Clients anweisen, wie sie geeignete URIs erstellen B. in HTML-Formularen und URI-Templates, indem diese Anweisungen in Medientypen und Linkbeziehungen definiert werden. " – aehlke

1

Hier eine Abbildung des aktuellen URLs ist das REST-Prinzip:

/question/show/<whatever> 

Wenn Sie die Frage als eine Ressource zu identifizieren, dann sollte es eine eindeutige URL haben. Mit GET, um es anzuzeigen (abrufen) ist die gängige Praxis. Es wird:

GET /question/<whatever> 

/question/edit/<whatever> 

Jetzt können Sie Ihre Benutzer möchten einen anderen Blick auf die gleiche Ressource haben, die ihm die Ressource (vielleicht mit Formular-Steuerelemente) bearbeiten können.

Zwei Optionen hier, Ihre Anwendung ist eine Anwendung (keine Website), dann können Sie besser JavaScript verwenden, um die Ressource in eine bearbeitbare Ressource auf der Clientseite umzuwandeln.

Wenn dies eine Website ist, dann können Sie die gleiche URL mit zusätzlichen Informationen verwenden, eine andere Ansicht zu spezifizieren, scheint die gängige Praxis zu sein:

GET /question/<whatever>;edit 

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

Dies ist zu ändern Frage, so PUT die richtige Methode zu verwenden:

PUT /question/<whatever> 

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

GET /question 

Jetzt müssen Sie noch mehr:

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

Tada :)

-2

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 

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 
Verwandte Themen