Quels sont les meilleurs verbes et actions d'URL RESTful communs?

86

J'essaie de trouver des informations sur les actions d'URL RESTful les meilleures et les plus courantes.

par exemple, quelle URL utilisez-vous pour afficher les détails d'un élément, pour modifier l'élément, mettre à jour, etc.

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

hmm. merci à tous ceux qui nous aident :)

Pure.Krome
la source

Réponses:

173

Utilisez des URL pour spécifier vos objets, pas vos actions:

Notez que ce que vous avez mentionné en premier n'est pas RESTful:

/questions/show/<whatever>

Au lieu de cela, vous devez utiliser vos URL pour spécifier vos objets:

/questions/<question>

Ensuite, vous effectuez l'une des opérations ci-dessous sur cette ressource.


AVOIR:

Utilisé pour obtenir une ressource, interroger une liste de ressources et également pour interroger des informations en lecture seule sur une ressource.

Pour obtenir une ressource de question:

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

Pour lister toutes les ressources de questions:

GET /questions HTTP/1.1
Host: whateverblahblah.com

PUBLIER:

Utilisé pour créer une ressource.

Notez que ce qui suit est une erreur:

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

Si l'URL n'est pas encore créée, vous ne devez pas utiliser POST pour la créer tout en spécifiant le nom. Cela devrait entraîner une erreur de ressource introuvable car elle n'existe pas encore. Vous devez d'abord METTRE la ressource sur le serveur. Vous pourriez faire valoir qu'en créant une nouvelle question, vous mettez également à jour la ressource / questions car elle renverrait désormais une autre question dans sa liste de questions.

Vous devriez faire quelque chose comme ceci pour créer une ressource en utilisant POST:

POST /questions HTTP/1.1
Host: whateverblahblah.com

Notez que dans ce cas, le nom de la ressource n'est pas spécifié, le chemin de l'URL des nouveaux objets vous sera renvoyé.

SUPPRIMER:

Utilisé pour supprimer la ressource.

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

METTRE:

Utilisé pour créer une ressource, ou l'écraser, pendant que vous spécifiez l'URL des ressources.

Pour une nouvelle ressource:

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

Pour écraser une ressource existante:

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

...Oui, ils sont pareils. PUT est souvent décrit comme la méthode «éditer», car en remplaçant la ressource entière par une version légèrement modifiée, vous avez édité ce que les clients OBTENIRont la prochaine fois.


Utilisation de REST dans les formulaires HTML:

La spécification HTML5 définit GET et POST pour l'élément de formulaire .

L'attribut de contenu de méthode est un attribut énuméré avec les mots-clés et états suivants:

  • Le mot-clé GET, mappé à l'état GET, indiquant la méthode HTTP GET.
  • Le mot-clé POST, mappant à l'état POST, indiquant la méthode HTTP POST.

Techniquement, la spécification HTTP ne vous limite pas à ces seules méthodes. Vous êtes techniquement libre d'ajouter les méthodes que vous voulez, mais dans la pratique, ce n'est pas une bonne idée. L'idée est que tout le monde sait que vous utilisez GET pour lire les données, donc cela va dérouter les choses si vous décidez d'utiliser à la place READ. Cela dit...

PIÈCE:

Il s'agit d'une méthode qui a été définie dans une RFC formelle. Il est conçu pour être utilisé lorsque vous souhaitez envoyer juste une modification partielle à une ressource, il serait utilisé un peu comme PUT:

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

La différence est que PUT doit envoyer toute la ressource, quelle que soit sa taille par rapport à ce qui a réellement changé, tandis que PATCH vous permet d'envoyer uniquement les modifications.

Brian R. Bondy
la source
Salut Brian .. plus je lis ceci, plus ça fait sens. Je suppose que certains navigateurs (ou versions de navigateur) ne prennent pas en charge PUT ou DELETE? si c'est le cas, utilisons-nous POST à ​​la place?
Pure.Krome
1
Salut Pure.Knome; Les navigateurs Web les prennent tous en charge, et toute bibliothèque HTTP devrait également tous les prendre en charge.
Brian R. Bondy
4
Je recommanderais d'acheter ce livre en passant si vous voulez tout savoir sur REST oreilly.com/catalog/9780596529260
Brian R. Bondy
1
@Brian: quelques questions supplémentaires sur vos exemples PUT. >> PUT / questions / <new_question> Pourquoi feriez-vous cela, au lieu de faire >> PUT / questions / parce que toutes les données du formulaire seront utilisées pour créer la nouvelle ressource? (suite du commentaire suivant) ...
Pure.Krome
1
@Brian R. Bondy, merci pour votre excellente réponse. La requête POST à ​​une ressource existante est décrite comme «ajout» dans le livre reposant d'Oreilly (pg: 100, 101), contrairement à votre terme général de «modification». Après tout, ajouter est plus spécifique que modifier - ce qui peut transmettre "PUT à une ressource existante" - et semble sémantiquement plus correct pour POST - ajouter une nouvelle ressource au lien spécifié, soit en ajoutant ou en créant une ressource enfant à cela .
Özgür
11

En supposant /questions/10que la question soit valide, la méthode est utilisée pour interagir avec elle.

POST pour y ajouter

PUT pour le créer ou le remplacer

OBTENEZ pour voir / interroger

et SUPPRIMER pour bien .. le supprimer.

L'URL ne change pas.

Allain Lalonde
la source
4
Faux. PUT doit être idempotent. Vous devez pouvoir effectuer plusieurs fois la même requête PUT, sans effet après la première fois. Ainsi, créer une ressource avec chaque requête PUT n'est pas idempotent.
aehlke
3
"Les méthodes PUT et DELETE sont définies pour être idempotentes, ce qui signifie que plusieurs requêtes identiques devraient avoir le même effet qu'une seule requête.", L'utilisation de put à un URI qui ne rend pas actuellement une ressource disponible peut créer une ressource. Mettre immédiatement à nouveau le ferait simplement de nouveau, ce qui n'aurait aucun effet. De cette façon, vous créez une ressource, mais la requête est toujours idempotente. Si vous revenez plus tard et souhaitez modifier la ressource, vous devez PUT sur le même URI avec des données différentes (ce qui serait une requête différente et pourrait elle-même être répétée un nombre illimité de fois avec le même résultat).
Allain Lalonde
1
En fait, jetez un œil à la réponse qui a reçu 25 votes ci-dessus, il est indiqué que PUT peut être utilisé pour créer ou remplacer une ressource.
Allain Lalonde
3
La création ne fonctionne que tant que la spécification de l'ID d'une nouvelle ressource est autorisée. Bien que cela soit possible, il est plus souvent plus pratique pour l'utilisateur de POSTER sur / collection et de recevoir des liens qui incluent le nouvel identifiant:
pgraham
2
@aehIke La création d'une nouvelle ressource par PUT ne la rend pas non-idempotente puisque l'idée est que si je 'PUT / items / 10' et l'élément 10 n'existaient pas auparavant, alors il sera juste créé. Cependant, si je «PUT / items / 10» à nouveau pour la deuxième fois, eh bien maintenant il existe déjà donc il sera juste remplacé, donc l'idempotence est préservée car les demandes PUT suivantes n'ont pas de nouvel effet secondaire. (Bien sûr, cela suppose que je continue à mettre exactement le même article à chaque fois)
Alappin
3

Je vais sortir sur une branche et deviner que vous ce que vous voulez dire est ce que sont les contrôleurs standard pour MVC quand vous dites "RESTful" urls, puisque vos exemples pourraient être considérés comme non "RESTful" (voir cet article).

Comme Rails a vraiment popularisé le style d'URL qui semble vous intéresser, je propose ci-dessous les actions de contrôleur par défaut produites par le ScaffoldingGenerator dans Ruby on Rails. Ceux-ci doivent être familiers à toute personne utilisant une application Rails.

Les actions et vues échafaudées sont: indexer, lister, afficher, nouveau, créer, modifier, mettre à jour, détruire

En règle générale, vous construisez ceci comme suit:

http://application.com/controller/<action>/<id>
Tvanfosson
la source
5
Les conventions d'URI hors bande ne sont PAS RESTful. Citant Fielding lui-même: "Une API REST ne doit pas définir de noms ou de hiérarchies de ressources fixes (un couplage évident entre le client et le serveur). Les serveurs doivent avoir la liberté de contrôler leur propre espace de noms. Au lieu de cela, autorisez les serveurs à indiquer aux clients comment construire les URI appropriés. , comme cela se fait dans les formulaires HTML et les modèles d'URI, en définissant ces instructions dans les types de médias et les relations de lien .. "
aehlke
1

Voici un mappage de vos URL actuelles en utilisant le principe REST:

/question/show/<whatever>

Si vous identifiez la question comme une ressource, elle doit avoir une URL unique. Utiliser GET pour l'afficher (le récupérer) est la pratique courante. Il devient:

GET /question/<whatever>

/question/edit/<whatever>

Vous voulez maintenant que votre utilisateur ait une autre vue de la même ressource qui lui permette de modifier la ressource (peut-être avec des contrôles de formulaire).

Deux options ici, votre application est une application (pas un site Web), alors vous feriez peut-être mieux d'utiliser JavaScript pour transformer la ressource en une ressource modifiable côté client.

S'il s'agit d'un site Web, vous pouvez utiliser la même URL avec des informations supplémentaires pour spécifier une autre vue, la pratique courante semble être:

GET /question/<whatever>;edit

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

C'est pour changer la question, donc PUT est la bonne méthode à utiliser:

PUT /question/<whatever>

/question/list   (lists the questions)

La liste de questions est en fait la ressource parente d'une question, c'est donc naturellement:

GET /question

Maintenant, vous pourriez en avoir besoin de plus:

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

Tada :)

Vincent Robert
la source
-1

Vos quatre exemples pourraient être:

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

Pour ajouter une question:

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

Le serveur répondrait:

200 OK (or 201 Created)
Location: /questions/456
Pbreitenbach
la source