J'ai une question relative à la conception de l'URL REST. J'ai trouvé quelques articles pertinents ici: Différentes représentations RESTful de la même ressource et ici: URL RESTful pour GET ressource par différents champs mais les réponses ne sont pas tout à fait claires sur les meilleures pratiques et pourquoi. Voici un exemple.
J'ai des URL REST pour représenter la ressource "utilisateurs". Je peux OBTENIR un utilisateur avec un identifiant ou une adresse e-mail, mais la représentation de l'URL reste la même pour les deux. En parcourant beaucoup de blogs et de livres, je constate que les gens font cela de différentes manières. Par exemple
lire cette pratique dans un livre et quelque part sur stackoverflow (je n'arrive pas à retrouver le lien)
GET /users/id={id}
GET /users/email={email}
lisez cette pratique sur de nombreux blogs
GET /users/{id}
GET /users/email/{email}
Les paramètres de requête sont normalement utilisés pour filtrer les résultats des ressources représentées par l'url, mais j'ai également vu cette pratique être utilisée
GET /users?id={id}
GET /users?email={email}
Ma question est, parmi toutes ces pratiques, laquelle serait la plus logique pour les développeurs qui utilisent les API et pourquoi? Je pense qu'il n'y a pas de règles gravées dans le marbre en ce qui concerne les conceptions d'URL REST et les conventions de dénomination, mais je voulais juste savoir quelle route je devrais emprunter pour aider les développeurs à mieux comprendre les API.
Toute l'aide appréciée!
la source
Réponses:
D'après mon expérience,
GET /users/{id} GET /users/email/{email}
c'est l'approche la plus courante. Je m'attendrais également à ce que les méthodes retournent un 404 Not Found si un utilisateur n'existe pas avec le fichierid
ouemail
. Je ne serais pas surpris de voirGET /users/id/{id}
non plus (même si à mon avis, c'est redondant).Commentaires sur les autres approches
GET /users/id={id} GET /users/email={email}
GET /users?id={id} GET /users?email={email}
id
et unemail
(par exempleGET /users?id={id}&email={email}
)? Sinon, je n'utiliserais pas une seule méthode de ressource comme celle-ci.id
,email
ou un identifiant unique d'être parmi les paramètres. Par exemple:GET /users?status=BANNED
peut renvoyer une liste d'utilisateurs interdits.Découvrez cette réponse à une question connexe.
la source
/users/id/{id}
, cela permet une fonctionnalité étendue, permet simplement d'accéder à une ressource via plusieurs identifiants (id, guid, nom). a également répondu iciGET /user/1234
et nonGET /users/123
En regardant cela de manière pragmatique, vous avez une collection d'utilisateurs:
Chaque utilisateur dispose d'un emplacement de ressource dédié:
Vous disposez également de plusieurs méthodes pour rechercher des utilisateurs:
Comme ce sont tous des paramètres de requête pour / users, ils devraient tous renvoyer des listes .. même s'il s'agit d'une liste de 1.
J'ai écrit un article de blog sur la conception pragmatique d'API RESTful ici qui en parle, entre autres, ici: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
la source
À propos des ressources utilisateur
sur le chemin,
/users
vous obtiendrez toujours une collection de ressources utilisateur renvoyées.sur le chemin,
/users/[user_id]
vous pouvez vous attendre à ce que plusieurs choses se produisent:Chaque singleton est identifié de manière unique par son chemin et son identifiant et vous les utilisez pour trouver la ressource. Il n'est pas possible d'utiliser plusieurs chemins pour le singleton.
Vous pouvez interroger le chemin
/users
avec des paramètres de requête (GET
paramètres). Cela renverra une collection avec des utilisateurs qui répondent aux critères demandés. La collection renvoyée doit contenir les ressources utilisateur, toutes avec leur chemin d'accès aux ressources d'identification dans la réponse.Les paramètres peuvent être n'importe quel champ présent dans les ressources de la collection;
firstName
,lastName
,id
À propos de l'e-mail
L'e-mail peut être une ressource ou une propriété / champ de la ressource utilisateur.
- Email en tant que propriété de l'utilisateur:
Si le champ est une propriété de l'utilisateur, la réponse de l'utilisateur ressemblerait à ceci:
Cela signifie qu'il n'y a pas de critère spécial pour des e - mails, mais vous pouvez maintenant trouver un utilisateur par son email en envoyant la demande suivante:
/[email protected]
. Qui (en supposant que les e-mails sont uniques aux utilisateurs) renverrait une collection avec un élément utilisateur qui correspond à l'e-mail.- Courriel en tant que ressource:
Mais si les e-mails des utilisateurs sont aussi des ressources. Ensuite, vous pouvez créer une API où
/users/[user_id]/emails
renvoie une collection d'adresses e-mail pour l'utilisateur avec un identifiantuser_id
./users/[user_id]/emails/[email_id]
renvoie l'email de l'utilisateur avec user_id et ['email_id']. Ce que vous utilisez comme identifiant dépend de vous, mais je m'en tiendrai à un entier. Vous pouvez supprimer un e-mail de l'utilisateur en envoyant uneDELETE
demande au chemin qui identifie l'e-mail que vous souhaitez supprimer. Ainsi, par exemple,DELETE
on/users/[user_id]/emails/[email_id]
supprimera l'e-mail avec email_id qui appartient à l'utilisateur avec user_id. Très probablement, seul cet utilisateur est autorisé à effectuer cette opération de suppression. Les autres utilisateurs recevront une réponse 401.Si un utilisateur ne peut avoir qu'une seule adresse e-mail, vous pouvez vous en tenir à
/users/[user_id]/email
Cela renvoie une ressource singleton. L'utilisateur peut mettre à jour son adresse e-mail enPUT
tapant l'adresse e-mail à cette URL.la source