Je suis nouveau sur REST et j'ai observé que dans certains services RESTful, ils utilisent différentes URI de ressources pour la mise à jour / obtenir / supprimer et créer. Tel que
- Créer - en utilisant / resources avec la méthode POST (observez le pluriel) à certains endroits en utilisant / resource (singulier)
- Mise à jour - utilisation de / resource / 123 avec la méthode PUT
- Get - Utilisation de / resource / 123 avec la méthode GET
Je suis un peu confus au sujet de cette convention de dénomination d'URI. Que devons-nous utiliser au pluriel ou au singulier pour la création de ressources? Quels devraient être les critères pour décider de cela?
rest
resources
naming-conventions
uri
JPReddy
la source
la source
Réponses:
La prémisse de l'utilisation
/resources
est qu'elle représente "toutes" les ressources. Si vous le faitesGET /resources
, vous retournerez probablement la collection entière. En POSTANT sur/resources
, vous ajoutez à la collection.Cependant, les ressources individuelles sont disponibles dans / ressource. Si vous faites cela
GET /resource
, vous allez probablement faire une erreur, car cette demande n'a aucun sens, alors qu'elle/resource/123
est parfaitement logique.En utilisant au
/resource
lieu de/resources
est similaire à la façon dont vous le feriez si vous travaillez avec, par exemple, un système de fichiers et une collection de fichiers et/resource
est le « répertoire » avec l'individu123
, les456
fichiers qu'il contient .Aucune des deux façons n'est bonne ou mauvaise, choisissez ce que vous préférez.
la source
Pour moi, il vaut mieux avoir un schéma que vous pouvez mapper directement au code (facile à automatiser), principalement parce que le code sera ce qui va se passer aux deux extrémités.
la source
Je ne vois pas l'intérêt de faire cela non plus et je pense que ce n'est pas la meilleure conception d'URI. En tant qu'utilisateur d'un service RESTful, je m'attendrais à ce que la ressource de liste ait le même nom, que j'accède à la liste ou à une ressource spécifique «dans» la liste. Vous devez utiliser les mêmes identificateurs, que vous souhaitiez utiliser la ressource de liste ou une ressource spécifique.
la source
Pluriel
orders/
obtient une liste d'index des commandes.Par exemple:
GET /resources
- retourne une liste des éléments de ressourcePOST /resources
- crée un ou plusieurs éléments de ressourcePUT /resources
- met à jour un ou plusieurs éléments de ressourcePATCH /resources
- met à jour partiellement un ou plusieurs éléments de ressourceDELETE /resources
- supprime tous les éléments de ressourceEt pour les éléments de ressource unique:
GET /resources/:id
- renvoie un élément de ressource spécifique basé sur un:id
paramètrePOST /resources/:id
- crée un élément de ressource avec l'ID spécifié (nécessite une validation)PUT /resources/:id
- met à jour un élément de ressource spécifiquePATCH /resources/:id
- met à jour partiellement un élément de ressource spécifiqueDELETE /resources/:id
- supprime un élément de ressource spécifiqueAux défenseurs du singulier, pensez-y de cette façon: demanderiez-vous à quelqu'un
order
une chose et attendez-vous une chose ou une liste de choses? Alors, pourquoi vous attendriez-vous à ce qu'un service retourne une liste de choses lorsque vous tapez/order
?la source
Order
est un bon nom pour une classe qui traite des instances singulières d'objets se référant à un ordre.OrderList
est le nom d'une classe qui traite de plusieursOrder
instances.Orders Table
est un bon nom pour une table de base de données de nombreuses commandes.Singulier
Commodité choses peuvent avoir des noms pluriels irréguliers. Parfois, ils n'en ont pas. Mais les noms singuliers sont toujours là.
par exemple CustomerAddress sur CustomerAddresses
Considérez cette ressource connexe.
C'est
/order/12/orderdetail/12
plus lisible et logique que/orders/12/orderdetails/4
.Tables de base de données
Une ressource représente une entité comme une table de base de données. Il doit avoir un nom singulier logique. Voici la réponse sur les noms de table.
Cartographie des classes
Les cours sont toujours singuliers. Les outils ORM génèrent des tables avec les mêmes noms que les noms de classe. Comme de plus en plus d'outils sont utilisés, les noms singuliers deviennent une norme.
En savoir plus sur le dilemme d'un développeur d'API REST
la source
/clothe/12/trouser/34
:)clothe
est un verbe. Les API de repos respectent généralement les noms lorsqu'ils parlent de ressources et utilisent des verbes lors de la description des actions. La forme singulière estclout
, mais est archaïque et serait probablement mieux remplacée pargarment
.Alors que la pratique la plus répandue est l'apis RESTful où les pluriels sont utilisés, par exemple
/api/resources/123
, il y a un cas spécial où je trouve l'utilisation d'un nom singulier plus approprié / expressif que les noms pluriels. C'est le cas des relations un à un. Plus précisément si l'élément cible est un objet de valeur (dans le paradigme de conception pilotée par domaine).Supposons que chaque ressource possède un un à un
accessLog
qui pourrait être modélisé comme un objet de valeur, c'est -à- dire pas une entité, donc pas d'ID. Il pourrait être exprimé comme suit/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 en effet un à un.la source
GET /users/123/location
devrait récupérer l'emplacement où l'utilisateur travaille. N'est-ce pasGET /users/123/locations
vraiment trompeur en tant que consommateur?accessLog
est modélisé comme un attribut ou une valeur plutôt que comme une entité, il doit être singulier. Si vous êtes donné à une ingénierie excessive, une entrée de journal serait une entité et vous l'auriez/api/accessLogEntries?resource=123
.Pourquoi ne pas suivre la tendance répandue des noms de table de base de données, où une forme singulière est généralement acceptée? J'y suis allé, j'ai fait ça - réutilisons.
Dilemme de nom de table: noms singuliers ou pluriels
la source
Je suis surpris de voir que tant de gens sautent dans le train du nom pluriel. Lors de la mise en œuvre de conversions du singulier au pluriel, vous occupez-vous des noms pluriels irréguliers? Aimez-vous la douleur?
Voir http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm
Il existe de nombreux types de pluriel irrégulier, mais ce sont les plus courants:
Type de nom Former le pluriel Exemple
la source
Du point de vue du consommateur d'API, les points de terminaison doivent être prévisibles afin
Idéalement...
GET /resources
devrait renvoyer une liste de ressources.GET /resource
doit renvoyer un code d'état de 400 niveaux.GET /resources/id/{resourceId}
devrait renvoyer une collection avec une ressource.GET /resource/id/{resourceId}
devrait renvoyer un objet ressource.POST /resources
devrait créer des ressources par lots.POST /resource
devrait créer une ressource.PUT /resource
devrait mettre à jour un objet ressource.PATCH /resource
doit mettre à jour une ressource en affichant uniquement les attributs modifiés.PATCH /resources
devrait mettre à jour les ressources par lots affichant uniquement les attributs modifiés.DELETE /resources
devrait supprimer toutes les ressources; je plaisante: 400 code de statutDELETE /resource/id/{resourceId}
Cette approche est la plus flexible et la plus riche en fonctionnalités, mais aussi la plus longue à développer. Donc, si vous êtes pressé (ce qui est toujours le cas avec le développement de logiciels), nommez simplement votre point de terminaison
resource
ou le plurielresources
. Je préfère la forme singulière car elle vous donne la possibilité d'introspection et d'évaluation par programme car toutes les formes plurielles ne se terminent pas par 's'.Cela dit, pour une raison quelconque, le développeur de pratique le plus couramment choisi a choisi d'utiliser le pluriel. C'est finalement la voie que j'ai choisie et si vous regardez les API populaires comme
github
ettwitter
, c'est ce qu'elles font.Certains critères de décision pourraient être:
C'est à vous de répondre. Quoi que vous fassiez, soyez cohérent.
la source
POST /users
devrait créer un seul utilisateur, en l'ajoutant à la collection. Je ne suis pas d'accord.POST /users
devrait créer une liste d'utilisateurs (même s'il s'agit d'une liste de 1), où asPOST /user
devrait créer exactement un utilisateur. Je ne vois aucune raison pour laquelle les points de terminaison des ressources au pluriel et au singulier ne peuvent pas coexister. Ils décrivent différents comportements et ne devraient surprendre personne de leur fonction.POST users/<id>
créerait un nouvel utilisateur.PUT /users/<id>
place dePOST
.POST
a l'interprétation "ajoutez ceci à la collection et déterminez l'id en tant que partie de cela".PUT
a l'interprétation «mettre à jour (ou ajouter) cette ressource avec cet identifiant». Voir restcookbook.com/HTTP%20Methods/put-vs-post pour une explication plus longue de ce principe.Mes deux cents: les méthodes qui passent leur temps à passer du pluriel au singulier ou vice-versa sont une perte de cycles CPU. Je suis peut-être de la vieille école, mais à mon époque, les choses s'appelaient pareil. Comment rechercher des méthodes concernant des personnes? Aucune expression régulière ne couvrira à la fois la personne et les personnes sans effets secondaires indésirables.
Les pluriels anglais peuvent être très arbitraires et ils encombrent inutilement le code. Respectez une seule convention de dénomination. Les langages informatiques étaient censés concerner la clarté mathématique, et non l'imitation du langage naturel.
la source
Je préfère utiliser la forme singulière pour la simplicité et la cohérence.
Par exemple, en considérant l'URL suivante:
/ client / 1
Je traiterai le client comme une collection client, mais pour simplifier, la partie collection est supprimée.
Un autre exemple:
/ équipement / 1
Dans ce cas, les équipements ne sont pas la forme plurielle correcte. Le traiter comme une collection d'équipements et le supprimer pour plus de simplicité le rend cohérent avec le cas client.
la source
POST /customer
censé faire la chose même - insérer un seul client?POST /customer
me lit comme si c'était POST'ing authe
client. Pas une collection de clients. Cependant, je dois admettre que le pluriel ou non pluriel est une préférence. Tant qu'ils ne sont pas mélangés comme l'autre réponse. Ce serait incroyablement déroutant.Un identifiant dans un itinéraire doit être vu de la même manière qu'un index d'une liste, et la dénomination doit procéder en conséquence.
Mais certaines ressources n'utilisent pas d'identifiants dans leurs itinéraires car il n'y en a qu'un ou un utilisateur n'a jamais accès à plusieurs, donc ce ne sont pas des listes:
la source
Avec les conventions de dénomination, il est généralement prudent de dire «choisissez-en un et respectez-le», ce qui est logique.
Cependant, après avoir expliqué REST à de nombreuses personnes, représenter les points de terminaison comme des chemins sur un système de fichiers est le moyen le plus expressif de le faire.
Il est sans état (les fichiers existent ou n'existent pas), hiérarchique, simple et familier - vous savez déjà comment accéder aux fichiers statiques, que ce soit localement ou via http.
Et dans ce contexte, les règles linguistiques ne peuvent vous mener que dans la mesure suivante:
Et j'aime ça.
Bien que, d'un autre côté - c'est votre répertoire, vous pouvez le nommer "une-ressource-ou-plusieurs-ressources" si c'est ce que vous voulez. Ce n'est pas vraiment la chose importante.
Ce qui est important, c'est que si vous placez un fichier nommé "123" dans un répertoire nommé "resourceS" (résultant en
/resourceS/123
), vous ne pouvez pas vous attendre à ce qu'il soit accessible via/resource/123
.N'essayez pas de le rendre plus intelligent qu'il ne doit l'être - passer du pluriel au singluar en fonction du nombre de ressources auxquelles vous accédez actuellement peut être esthétique pour certains, mais ce n'est pas efficace et cela n'a pas de sens dans un système hiérarchique .
Remarque: Techniquement, vous pouvez créer des "liens symboliques", ce qui
/resources/123
est également accessible via/resource/123
, mais le premier doit encore exister!la source
Jetez un oeil à Google d » API Guide de conception: les noms des ressources pour une autre prise sur les ressources de nommage.
En bref:
Cela vaut la peine d'être lu si vous pensez à ce sujet.
la source
L'utilisation du pluriel pour toutes les méthodes est plus pratique au moins sous un aspect: si vous développez et testez une API de ressource à l'aide de Postman (ou d'un outil similaire), vous n'avez pas besoin de modifier l'URI lorsque vous passez de GET à PUT à POST, etc. .
la source
Les deux représentations sont utiles. J'avais utilisé le singulier pour plus de commodité pendant un certain temps, l'inflexion peut être difficile. Mon expérience dans le développement d'API REST strictement singulières, les développeurs consommant le point de terminaison manquant de certitude quant à la forme du résultat. Je préfère maintenant utiliser le terme qui décrit le mieux la forme de la réponse.
Si toutes vos ressources sont de niveau supérieur, vous pouvez vous en sortir avec des représentations singulières. Éviter l'inflexion est une grande victoire.
Si vous effectuez une sorte de lien profond pour représenter des requêtes sur les relations, les développeurs écrivant sur votre API peuvent être aidés par une convention plus stricte.
Ma convention est que chaque niveau de profondeur dans un URI décrit une interaction avec la ressource parent, et l'URI complet devrait décrire implicitement ce qui est récupéré.
Supposons que nous ayons le modèle suivant.
Si je devais fournir une ressource qui permet à un client d'obtenir le gestionnaire d'un ami particulier d'un utilisateur particulier, cela pourrait ressembler à ceci:
GET /users/{id}/friends/{friendId}/manager
Voici quelques exemples supplémentaires:
GET /users
- répertorier les ressources utilisateur dans la collection d'utilisateurs globalePOST /users
- créer un nouvel utilisateur dans la collection globale d'utilisateursGET /users/{id}
- récupérer un utilisateur spécifique de la collection d'utilisateurs globaleGET /users/{id}/manager
- obtenir le gestionnaire d'un utilisateur spécifiqueGET /users/{id}/friends
- obtenir la liste des amis d'un utilisateurGET /users/{id}/friends/{friendId}
- obtenir un ami spécifique d'un utilisateurLINK /users/{id}/friends
- ajouter une association d'amis à cet utilisateurUNLINK /users/{id}/friends
- supprimer une association d'amis de cet utilisateurRemarquez comment chaque niveau correspond à un parent sur lequel il est possible d'agir. L'utilisation de parents différents pour le même objet est contre-intuitive. La récupération d'une ressource à
GET /resource/123
ne laisse aucune indication que la création d'une nouvelle ressource doit être effectuée àPOST /resources
la source
Je sais que la plupart des gens sont entre décider d'utiliser le pluriel ou le singulier. Le problème qui n'a pas été abordé ici est que le client devra savoir lequel vous utilisez, et il est toujours probable qu'il fasse une erreur. C'est de là que vient ma suggestion.
Et les deux? Et par cela, je veux dire utiliser le singulier pour l'ensemble de votre API, puis créer des itinéraires pour transmettre les demandes faites au pluriel au singulier. Par exemple:
Vous obtenez l'image. Personne n'a tort, un effort minimal et le client aura toujours raison.
la source
/resources
et est toujours redirigé vers/resource
, vous l'avez mal fait. Si quelqu'un d'autre utilise votre API, il peut soit utiliser directement l'URL correcte, soit être redirigé (ce qui fonctionne mais est faux) et c'est vous qui avez ouvert la mauvaise voie.Je n'aime pas voir la
{id}
partie des URL se chevaucher avec des sous-ressources, car celaid
pourrait théoriquement être n'importe quoi et il y aurait une ambiguïté. Il mélange différents concepts (identifiants et noms de sous-ressources).Des problèmes similaires sont souvent vus dans des
enum
constantes ou dossier structures, où les différents concepts sont mélangés (par exemple, lorsque vous avez des dossiersTigers
,Lions
etCheetahs
, puis aussi un dossier appeléAnimals
au même niveau - cela n'a aucun sens que l' on est un sous - ensemble de la autre).En général, je pense que la dernière partie nommée d'un point de terminaison devrait être singulière si elle concerne une seule entité à la fois, et plurielle si elle traite d'une liste d'entités.
Donc, les points de terminaison qui traitent avec un seul utilisateur:
Ensuite, il existe une ressource distincte pour effectuer des requêtes sur les utilisateurs, qui retournent généralement une liste:
Et voici quelques exemples d'une sous-ressource qui traite avec un utilisateur spécifique:
Faites-vous un ami (lien plusieurs à plusieurs):
Il n'y a jamais d'ambiguïté, et la dénomination plurielle ou singulière de la ressource est une indication pour l'utilisateur de ce à quoi il peut s'attendre (liste ou objet). Il n'y a pas de restrictions sur
id
s, ce qui permet théoriquement d'avoir un utilisateur avec l'idnew
sans chevaucher avec un nom de sous-ressource (futur potentiel).la source
Utilisez le singulier et profitez de la convention anglaise vue par exemple dans "Business Directory".
Beaucoup de choses lisent de cette façon: "Book Book", "Dog Pack", "Art Gallery", "Film Festival", "Car Lot", etc.
Cela correspond commodément au chemin de l'URL de gauche à droite. Type d'élément à gauche. Définissez le type à droite.
Récupère-t-il
GET /users
vraiment un ensemble d'utilisateurs? Pas habituellement. Il récupère un ensemble de talons contenant une clé et peut-être un nom d'utilisateur. Ce n'est donc pas vraiment de/users
toute façon. C'est un index d'utilisateurs, ou un "index d'utilisateurs" si vous voulez. Pourquoi ne pas l'appeler ainsi? C'est un/user/index
. Puisque nous avons nommé le type d'ensemble, nous pouvons avoir plusieurs types montrant différentes projections d'un utilisateur sans avoir recours aux paramètres de requête, par exempleuser/phone-list
ou/user/mailing-list
.Et qu'en est-il de l'utilisateur 300? C'est encore
/user/300
.En conclusion, HTTP ne peut avoir qu'une seule réponse à une seule demande. Un chemin fait toujours référence à quelque chose de singulier.
la source
Pour moi, les pluriels manipulent la collection , tandis que les singuliers manipulent l' élément à l' intérieur de cette collection.
La collecte permet les méthodes GET / POST / DELETE
L'élément permet les méthodes GET / PUT / DELETE
Par exemple
POST sur / les étudiants ajouteront un nouvel étudiant à l'école.
SUPPRIMER sur / élèves supprimera tous les élèves de l'école.
SUPPRIMER sur / étudiant / 123 supprimera l'élève 123 de l'école.
Cela peut sembler sans importance, mais certains ingénieurs oublient parfois l'ID. Si l'itinéraire était toujours pluriel et effectuait une SUPPRESSION, vous pourriez accidentellement effacer vos données. Alors que manquer l'identifiant au singulier renverra une route 404 introuvable.
Pour développer davantage l'exemple si l'API était censée exposer plusieurs écoles, alors quelque chose comme
SUPPRIMER dans / école / abc / élèves supprimera tous les élèves de l'école
abc
.Choisir le bon mot est parfois un défi en soi, mais j'aime maintenir la pluralité pour la collection. Par exemple
cart_items
oucart/items
se sent bien. En revanche, la suppressioncart
supprime l'objet du panier lui-même et non les articles du panier;).la source
Que diriez-vous:
/resource/
(pas/resource
)/resource/
signifie que c'est un dossier contenant quelque chose appelé "ressource", c'est un dossier "resouce".Et je pense aussi que la convention de dénomination des tables de base de données est la même, par exemple, une table appelée "utilisateur" est une "table utilisateur", elle contient quelque chose appelé "utilisateur".
la source
Je préfère utiliser les deux au pluriel (
/resources
) et le singulier (/resource/{id}
) car je pense que cela sépare plus clairement la logique entre travailler sur la collecte de ressources et travailler sur une seule ressource.En tant qu'effet secondaire important, cela peut également aider à empêcher quelqu'un d'utiliser incorrectement l'API. Par exemple, considérons le cas où un utilisateur essaie à tort d'obtenir une ressource en spécifiant l'ID en tant que paramètre comme ceci:
Dans ce cas, lorsque nous utilisons la version plurielle, le serveur ignorera très probablement le paramètre Id et renverra la liste de toutes les ressources. Si l'utilisateur ne fait pas attention, il pensera que l'appel a réussi et utilisera la première ressource de la liste.
En revanche, lors de l'utilisation du singulier:
le serveur retournera très probablement une erreur parce que l'ID n'est pas spécifié de la bonne manière, et l'utilisateur devra se rendre compte que quelque chose ne va pas.
la source