Existe-t-il des directives de convention de dénomination pour les API REST? [fermé]

212

Lors de la création d'API REST, existe-t-il des directives ou des normes de facto pour les conventions de dénomination au sein de l'API (par exemple: composants de chemin de point de terminaison d'URL, paramètres de chaîne de requête)? Les casquettes de chameau sont-elles la norme ou soulignent-elles? autres?

Par exemple:

api.service.com/helloWorld/userId/x

ou

api.service.com/hello_world/user_id/x

Remarque: Il ne s'agit pas de la conception de l'API RESTful, mais plutôt des directives de convention de dénomination à utiliser pour les éventuels composants de chemin et / ou les paramètres de chaîne de requête utilisés.

Toutes les directives seraient appréciées.

jnorris
la source

Réponses:

150

Je pense que vous devriez éviter les casquettes de chameau. La norme consiste à utiliser des lettres minuscules. Je voudrais également éviter les tirets bas et utiliser des tirets à la place

Votre URL devrait donc ressembler à ceci (en ignorant les problèmes de conception comme vous l'avez demandé :-))

api.service.com/hello-world/user-id/x
LiorH
la source
187
Selon la RFC2616, seules les parties schéma et hôte de l'URL sont insensibles à la casse. Le reste de l'URL, c'est-à-dire le chemin d'accès et la requête DEVRAIT être sensible à la casse. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller
10
Daniel, vous avez raison, merci de l'avoir signalé. Cependant, de facto, nous nous attendons généralement à ce que les URL ignorent les cas, en particulier la partie nom de la ressource. Cela n'aurait aucun sens pour userid & UserId de se comporter différemment (à moins que l'un d'eux ne renvoie 404)
LiorH
18
@LiorH: Pourquoi pensez-vous que cela "n'a aucun sens" d'être sensible à la casse? De nombreux autres contextes sont sensibles à la casse pour un bon effet. Il y a des services Web (par exemple , Amazon S3) qui font respecter la casse pour les points finaux URL, et je pense qu'il est tout à fait approprié.
Hank
6
Les systèmes de fichiers du serveur @Dennis Windows ne respectent pas la casse par défaut, sauf si je me trompe profondément technet.microsoft.com/en-us/library/cc725747.aspx
samspot
5
@samspot Bon! Je pensais que Windows était allé directement aux noms de fichiers sensibles à la casse lors de la création de serveurs. WOW, ils poussaient toujours LEUR chemin aussi longtemps qu'ils le pouvaient, c'est-à-dire "1 MicroSoft Way". ;-)
Dennis
87

L'API REST pour Dropbox , Twitter , Google Web Services et Facebook utilise tous des traits de soulignement.

jz1108
la source
24
L'un des effets secondaires de cela est que les «mots» soulignés sont conservés ensemble, ensemble dans les index de recherche de Google. Les hyhenated sont divisés en mots séparés.
Dennis
Exemple: dev.twitter.com/docs/api/1.1
mike kozelsky
11
Alors que l'API Google Maps utilise des traits de soulignement, le guide de style Google nécessite Camel Case. L' API Google+ et l' API de recherche personnalisée , entre autres, utilisent Camel Case.
Benjamin
2
Pourtant, ils utilisent toujours «-» comme séparateur ces URL: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter. com / aperçu / études de cas En revanche, ils utilisent camelCase dans les paramètres de requête.
Mattias
1
Personne ne sait ...
Piotr Kula
84

Examinez attentivement les URI pour les ressources Web ordinaires. Ce sont vos modèles. Pensez aux arborescences de répertoires; utilisez des noms de fichiers et de répertoires similaires à Linux.

HelloWorldn'est pas vraiment une bonne classe de ressources. Cela ne semble pas être une "chose". C'est possible, mais ce n'est pas très semblable à un nom. A greetingest une chose.

user-idpourrait être un nom que vous récupérez. Il est cependant douteux que le résultat de votre demande soit uniquement un user_id. Il est beaucoup plus probable que le résultat de la demande soit un utilisateur. Par conséquent, userest le nom que vous récupérez

www.example.com/greeting/user/x/

Ça a du sens pour moi. Concentrez-vous sur le fait de faire de votre demande REST une sorte de locution - un chemin à travers une hiérarchie (ou taxonomie ou répertoire). Utilisez les noms les plus simples possibles, en évitant si possible les phrases nominales.

Généralement, les phrases nominales composées signifient généralement une autre étape dans votre hiérarchie. Vous n'avez donc pas /hello-world/user/et /hello-universe/user/. Vous avez /hello/world/user/et hello/universe/user/. Ou peut /world/hello/user/- être et /universe/hello/user/.

Il s'agit de fournir un chemin de navigation entre les ressources.

S.Lott
la source
4
Ma question concerne davantage la convention de dénomination des éventuels chemins d'accès et / ou paramètres de chaîne de requête quels qu'ils soient. Je suis d'accord avec vous des recommandations de conception, alors merci, mais avec cette question, je pose simplement des questions sur les conventions de dénomination.
jnorris
1
Juste pour noter, rien ne vous empêche d'utiliser REST pour les ressources non hiérarchiques. Les conventions de dénomination URI réelles que vous utilisez sont sans importance, utilisez simplement ce que vous pensez être agréable et facile à analyser sur le serveur. Le client ne doit rien savoir sur la génération de vos URI car vous devez envoyer les URI aux ressources via un hypertexte dans vos réponses.
aehlke
30

'UserId' est totalement la mauvaise approche. L'approche Verb (méthodes HTTP) et Noun est ce que Roy Fielding signifiait pour l' architecture REST . Les noms sont soit:

  1. Une collection de choses
  2. Une chose

Une bonne convention de dénomination est:

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

Où {media_type} est l'un de: json, xml, rss, pdf, png, même html.

Il est possible de distinguer la collection en ajoutant un 's' à la fin, comme:

'users.json' *collection of things*
'user/id_value.json' *single thing*

Mais cela signifie que vous devez savoir où vous avez mis le «s» et où vous ne l'avez pas fait. De plus, la moitié de la planète (Asiatiques pour commencer) parle des langues sans pluriels explicites, donc l'URL leur est moins conviviale.

Dennis
la source
Que signifie {var}? Si je recherche un utilisateur par son nom, ce serait par exemple ... / user / username / tomsawyer?
Hans-Peter Störr
1
Si vous aviez trois variables (var) s nommées x, y, z, alors votre URL ressemblerait à: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis
@hstoerr Juste pour être sûr d'avoir été clair, la plupart des langages de script utilisent une sorte de «substitution de variable entre crochets». Donc, {var} signifie qu'une variable (son nom) y réside, et donc la {valeur} suivante est l'endroit où la valeur du {var} qui la précède. Exemple: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_averages_higher_than/4.json] essaierait d'obtenir les résultats json de yelp.com pour afficher des informations sur les aliments. une valeur supérieure à 4.
Dennis
C'est la meilleure réponse à mon avis et bravo pour penser à l'international.
beiller
14

Non. REST n'a rien à voir avec les conventions de dénomination d'URI. Si vous incluez ces conventions dans votre API, hors bande, au lieu de seulement via l'hypertexte, votre API n'est pas RESTful.

Pour plus d'informations, voir http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

aehlke
la source
44
Reposez-vous ... c'est toujours agréable d'avoir de belles URL.
HDave
1
D'accord avec @HDave, c'est très dans l'esprit de REST d'avoir des URL faciles à comprendre. Vous travaillez avec des URL, pourquoi ne voudriez-vous pas qu'elles soient aussi facilement comprises que les noms de variables et de paramètres dans votre code?
mahemoff
4
@mahemoff désolé, c'est moi d'être super pédant. Mais à quoi ressemblent vos URL n'a rien à voir avec REST. Cela ne signifie pas qu'ils ne sont pas une bonne chose à avoir, ils sont juste orthogonaux à ce que décrit REST. Il est trompeur de dire que REST consiste à structurer les URL de cette manière, car cela conduit les gens à décrire les API RPC comme REST simplement parce qu'ils ont des URL lisibles / structurées.
aehlke
5
En résumé, de belles URL sont superbes et tout le monde devrait les avoir. Cela n'a rien à voir avec REST.
aehlke
1
@aehlke merci d'avoir clarifié cela. Le reste ne concerne pas les structures d'URL. Je ne comprends pas pourquoi il est si difficile à comprendre pour les gens.
user1431072
9

Les noms de domaine ne sont pas sensibles à la casse, mais le reste de l'URI peut certainement l'être. C'est une grosse erreur de supposer que les URI ne sont pas sensibles à la casse.


la source
2

Je ne pense pas que le cas des chameaux soit le problème dans cet exemple, mais j'imagine qu'une convention de dénomination plus RESTful pour l'exemple ci-dessus serait:

api.service.com/helloWorld/userId/x

plutôt que de faire de userId un paramètre de requête (ce qui est parfaitement légal), mon exemple dénote cette ressource, IMO, d'une manière plus RESTful.

Gandalf
la source
Il ne s'agit pas de la conception de l'API RESTful, mais plutôt des directives de convention de dénomination à utiliser pour les éventuels composants de chemin et / ou les paramètres de chaîne de requête utilisés. Dans votre exemple, les composants du chemin doivent-ils être dans des casquettes de chameau comme vous l'avez utilisé, ou des soulignements?
jnorris
Eh bien, car dans REST, vos URL sont vos interfaces, alors c'est une sorte de question sur l'API. Bien que je ne pense pas qu'il existe de lignes directrices spécifiques à votre exemple, j'irais personnellement avec l'étui à chameau.
Gandalf
Vous ne devez pas utiliser de paramètres de requête pour les ressources que vous souhaitez mettre en cache à n'importe quel niveau de la pile HTTP.
aehlke
@aehlke L'inverse est également vrai. Si vous ne voulez PAS que les paramètres de requête soient mis en cache, utilisez le style GET pour les paramètres, ~ OU ~ assurez-vous que DARN SURE pour modifier / insérer des en-têtes anti-mise en cache pour tout ce que vous ne voulez pas mettre en cache. En outre, il y a un en-tête qui est un hachage de l'objet / page de retour, utilisez-le pour indiquer les changements de choses que vous voulez mettre en cache, mais mis à jour lorsqu'il y a des modifications.
Dennis
@aehlke J'ai découvert la mise en cache et je l'ajoute. Je me souviens d'une présentation CodeCamp où l'un des accélérateurs faisait tous ces en-têtes, puis changeait le nom du fichier et toutes les références à celui-ci lorsque son contenu était modifié afin que les borwsers et les proxys hébergent une version plus récente après un long temps de cache. ensemble. Voici tous les détails sanglants: developers.google.com/speed/docs/best-practices/caching
Dennis
2

Si vous authentifiez vos clients avec Oauth2, je pense que vous aurez besoin de souligner pour au moins deux de vos noms de paramètres:

  • identité du client
  • client_secret

J'ai utilisé camelCase dans mon (non encore publiée) API REST. En écrivant la documentation de l'API, j'ai pensé à tout changer pour snake_case, donc je n'ai pas à expliquer pourquoi les paramètres Oauth sont snake_case alors que d'autres paramètres ne le sont pas.

Voir: https://tools.ietf.org/html/rfc6749

Michael
la source
0

Je dirais qu'il est préférable d'utiliser le moins de caractères spéciaux possible dans les URL REST. L'un des avantages de REST est qu'il rend "l'interface" d'un service facile à lire. Le cas Camel ou Pascal est probablement bon pour les noms de ressources (utilisateurs ou utilisateurs). Je ne pense pas qu'il y ait vraiment de normes strictes autour de REST.

De plus, je pense que Gandalf a raison, il est généralement plus propre dans REST de ne pas utiliser les paramètres de chaîne de requête, mais de créer des chemins qui définissent les ressources que vous souhaitez traiter.

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

Andy White
la source