801 votes

Dois-je utiliser la convention de nom au singulier ou au pluriel pour les ressources REST?

Certains services RESTful utilisent des URI de ressources différentes pour la mise à jour, la récupération et la suppression, comme :

  • Créer - en utilisant /ressources avec la méthode POST (en observant le pluriel) dans certains cas en utilisant /ressource (singulier)
  • Mettre à jour - en utilisant /ressource/123 avec la méthode PUT
  • Obtenir - en utilisant /ressource/123 avec la méthode GET

Je suis un peu confus à propos de cette convention de nommage d'URI. Devrions-nous utiliser le pluriel ou le singulier pour la création de ressources ? Quels critères devraient être pris en compte pour décider de cela ?

13 votes

Suivant ce sujet, j'ai recueilli quelques exemples de célèbres API REST dans un article : inmensosofa.blogspot.com/2011/10/….

12 votes

La conclusion à laquelle je suis parvenue après avoir lu toutes les réponses ci-dessous : Toujours utiliser le singulier car (a) c'est cohérent, (b) cela correspond directement aux noms de classes et de tables singulières, (c) certains noms pluriels sont irréguliers (imprévisibles) en anglais

0 votes

Voir cette réponse pour un lien vers les conventions de nommage de table singulière, et il y a un autre article qui mentionne ce problème exact Le dilemme des développeurs d'API Rest - merci @Sorter

846voto

jla Points 527

Pour moi, il vaut mieux avoir un schéma que vous pouvez mapper directement vers du code (facile à automatiser), principalement parce que le code va être présent aux deux extrémités.

GET  /orders          <---> orders 
POST /orders          <---> orders.push(data)
GET  /orders/1        <---> orders[1]
PUT  /orders/1        <---> orders[1] = data
GET  /orders/1/lines  <---> orders[1].lines
POST /orders/1/lines  <---> orders[1].lines.push(data)

34 votes

La difficulté ou la facilité de ceci est due au fait de ne pas respecter HATEOS. Peu importe s'il est au pluriel ou au singulier ou quoi que ce soit d'autre. Vous devez respecter les URI envoyés par le serveur et ne pas "construire" vos URI sur le client. Ensuite, vous n'avez aucun mapping à faire pour votre code.

14 votes

@richard Le client doit toujours effectuer le mappage. En HATEOS, ils devraient mapper à un nom qui représente la relation (rel) avec la construction de l'URI. Le rel, la méthode (verbe) et le Content-Type constituent ensuite le média de la ressource. Cela ne préjuge pas de la nécessité d'une bonne conception d'URI. Même si le client peut donner la priorité au nom du rel, les développeurs de l'API ont toujours besoin d'une bonne norme lisible par l'homme pour la construction d'URI.

0 votes

@BrianReindel d'accord.

405voto

Will Hartung Points 57465

La prémisse d'utiliser /resources est qu'elle représente "toutes" les ressources. Si vous faites un GET /resources, vous retournerez probablement l'ensemble de la collection. En faisant un POST sur /resources, vous ajoutez à la collection.

Cependant, les ressources individuelles sont disponibles à /resource. Si vous faites un GET /resource, vous obtiendrez probablement une erreur, car cette demande n'a aucun sens, alors que /resource/123 a tout à fait du sens.

Utiliser /resource au lieu de /resources est similaire à ce que vous feriez si vous travailliez, disons, avec un système de fichiers et une collection de fichiers et que /resource est le "répertoire" avec les fichiers individuels 123, 456 dedans.

Aucune des deux façons n'est bonne ou mauvaise, allez avec ce que vous préférez.

79 votes

Super réponse! Mais les répertoires "par défaut" dans Windows ont des noms pluriels. Comme "Program Files", "Utilisateurs", "Documents", "Vidéos" etc. J'ai également rencontré beaucoup plus souvent des noms pluriels dans les URL des sites web.

84 votes

La convention de facto que la plupart des gens et des API utilisent est de le garder au pluriel en permanence. Les identifiants spécifient UNE ressource cars/id.

327 votes

"Ni l'un ni l'autre n'est juste ou faux, allez avec ce que vous aimez le mieux.". Ah la célèbre phrase que j'entends si souvent et dont j'en ai marre d'entendre des gens. Les conventions sont importantes et DEVRAIENT être débattues de manière constructive au sein de la communauté, c'est là que de meilleures solutions émergent et de bonnes pratiques. Lorsque vous utilisez à la fois le pluriel et le singulier pour les noms de ressources dans les URIs, cela complique votre code et l'API car l'utilisateur et le code derrière l'API doivent en tenir compte dans les routes et la logique pour différencier le singulier du pluriel alors que si vous vous en tenez simplement au pluriel tout le temps, vous n'avez aucun problème."

335voto

Je ne vois pas non plus l'intérêt de faire cela et je pense que ce n'est pas la meilleure conception d'URI. En tant qu'utilisateur d'un service RESTful, je m'attends à ce que la ressource de la liste ait le même nom, que j'accède à la liste ou à une ressource spécifique 'dans' la liste. Vous devriez utiliser les mêmes identifiants que vous souhaitiez utiliser la ressource de liste ou une ressource spécifique.

96 votes

C'est la meilleure réponse à mes yeux. J'apprécie que les concepteurs d'API aiment la correction linguistique de dire "obtenir la ressource n°123", mais c'est une corvée supplémentaire de codage lors de l'écriture des clients de l'API ainsi que de la documentation d'aide. (GET /api/people vs. GET /api/person/123 ? beurk.) ... Au lieu de penser à cela comme "obtenir la ressource n°123", formulez-le dans votre tête comme "obtenir dans la collection de ressources qui correspondent à #123".

0 votes

@WarrenRumak en réalité, il ne devrait y avoir aucun problème si les APIs étaient basées sur l'hypermedia. Hélas, la plupart ne le sont pas. Quoi qu'il en soit, dans un tel cas, le nommage serait d'une importance secondaire lors de la mise en œuvre

5 votes

Le fait de distinguer les ressources au singulier/pluriel ne concerne pas la correction linguistique mais l'échelle. /employés/12 me semble être le sous-ensemble de la ressource des employés avec l'identifiant '12' (cela pourrait signifier n'importe quoi, par exemple une requête de recherche enregistrée sur des employés récemment licenciés). Si vous lisez ce qui précède comme l'employé avec l'identifiant '12', comment représenteriez-vous le sous-ensemble ? La seule option consiste à rendre les URI plus complexes ou à distinguer les collections contenant des objets des objets eux-mêmes (c'est-à-dire singulier vs pluriel).

42voto

Debriter Points 93

Pourquoi ne pas suivre la tendance prédominante des noms de tables de base de données, où une forme singulière est généralement acceptée? Déjà vu, déjà fait - réutilisons.

Problème de nommage de table : Noms singuliers vs. pluriels

10 votes

Das Auto est bien meilleur que Die Autos. De plus, les conventions de pluriel en anglais ne sont pas cohérentes.

11 votes

L'espace de noms des ressources relève de la sémantique, pas de l'implémentation. Ainsi, utiliser l'analogie des tables de la base de données n'est pas très chanceux. De plus, lors de travailler avec les bases de données, vous manipulez uniquement des tables, bien sûr vous pouvez affecter le contenu (les lignes), mais dans REST il n'y a aucune contrainte pour manipuler une seule ressource directement.

5 votes

Je pense que c'est une bonne analogie, mais plus important que de décider d'aller au singulier ou au pluriel est d'être cohérent avec celui que vous choisissez. Vous n'allez pas insérer dans Users et ensuite sélectionner dans User. La même règle devrait s'appliquer aux ressources REST - ne les renommez pas en fonction de ce que vous faites.

36voto

redzedi Points 356

Alors que la pratique la plus répandue est l'utilisation d'API RESTful où les pluriels sont utilisés par exemple /api/resources/123, il y a un cas particulier où j'estime qu'un nom singulier est plus approprié/expressif que des noms au pluriel. Il s'agit des relations un à un. Plus précisément, si l'élément cible est un objet de valeur (dans le paradigme de la conception pilotée par le domaine).

Supposons que chaque ressource ait un accessLog un à un qui pourrait être modélisé comme un objet de valeur, c'est-à-dire non une entité donc pas d'ID. Cela pourrait être exprimé comme /api/resources/123/accessLog. Les verbes habituels (POST, PUT, DELETE, GET) exprimeraient de manière appropriée l'intention et aussi le fait que la relation est effectivement un à un.

6 votes

Essayer bien. Mais ce serait mieux comme "accessLogEntries". :-)

10 votes

@TomRussell pourquoi ? Les implications de cela sont importantes. Je comprends pourquoi vous utiliseriez le pluriel même lorsque vous accédez à une ressource par un identifiant, mais pour un rapport de plusieurs à un ou de un à un c'est assez trompeur. Considérez une API qui gère les membres du personnel pour une entreprise multi-site. Chaque membre du personnel travaille dans un seul lieu. GET /users/123/location devrait récupérer l'emplacement où travaille l'utilisateur. N'est-ce pas GET /users/123/locations vraiment trompeur pour un consommateur ?

1 votes

@CarrieKendall Je comprends votre point. Puisque accessLog est modélisé comme un attribut, ou une valeur, plutôt qu'une entité, il doit être au singulier. Si vous avez tendance à sur-ingénierie, alors une entrée de journal serait une entité et vous auriez /api/accessLogEntries?resource=123.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X