web-dev-qa-db-fra.com

Quand utiliser des ressources imbriquées dans une API reposante

J'ai deux ressources: utilisateurs et liens.

Les utilisateurs peuvent avoir plusieurs liens associés à eux. J'ai conçu mon API reposant afin de pouvoir atteindre les liens associés à un utilisateur à l'URI suivant:

/users/:id/links

Cependant, j'ai toujours besoin d'avoir une URI pour juste des liens - parfois je voudrais peut-être tous les liens, quel que soit leur utilisateur.

Pour cela, j'ai:

/links

Est-ce que ça sonne bien? Avoir deux URI pour les liens?

Je me demande si je devrais plutôt rejoindre les liens d'un utilisateur avec une URI telle que:

/links/user/:id ou /links/?user=:id

De cette façon, je n'ai qu'une ressource pour les liens.

16
Oliver Joseph Ash

Non, il n'y a rien de mal à avoir plusieurs ressources pour la même chose "chose", dans ce cas des listes de liens.

Nous avons récemment eu du mal avec le même problème. Notre décision était de disposer de toutes les ressources où il n'y a pas de Strict la propriété de ne pas être imbriquée. En d'autres termes, les liens seraient modélisés sous

/links -- all links
/links/:linkid -- a particular link

Ensuite, les filtres de la collection Liens sont exprimés en paramètres de requête. Donc, pour obtenir les liens d'un certain utilisateur, vous utiliseriez:

/links?user=/users/:userid

Cela permet également une composition plus facile des filtres:

/links?user=/users/10&since=2013-01-01

Et il est facile de comprendre conceptuellement - vous avez une collection d'articles et vous ajoutez des filtres à celui-ci.

Cela étant dit, il n'y a rien de plus "reposant" à propos de cette approche que tout autre système de dénomination de l'URI. C'est juste une convention que nous avons trouvée lisible par l'homme et facile pour les développeurs américains de comprendre et d'embrasser. REST ne se soucie pas de ce que vous avez mis dans vos identifiants de ressources.

16
waxwing

Mon inquiétude est donc:/Utilisateurs /: Iservenid/Liens renvoie "Liens", mais si l'user_id n'est pas identifié, cela devrait renvoyer une 404.

Toutefois

/ Liens? UserID =: UserID pourrait potentiellement renvoyer une liste vide (essentiellement un 200) qui est probablement probablement un bug. Et tout à fait possible.

Bien que les deux fonctionnent, l'imbrication vous donne des fonctionnalités supplémentaires que vous pouvez approcher ultérieurement.

1
Richard Browne