101 votes

Api REST : demande de plusieurs ressources en une seule fois

J'essaie de concevoir une API RESTful permettant aux utilisateurs d'extraire un seul produit ou une liste de produits en une seule requête GET. Chaque produit a un identifiant unique.

L'URL unique du produit est assez simple :

http://mycompany.com/api/v1/product/id

Cela renvoie les informations relatives à un seul produit. Je ne sais pas à quoi doit ressembler l'URL pour les informations sur plusieurs produits.

Et si

http://mycompany.com/api/v1/product/ids

où ids est une liste d'ids séparés par des virgules ?

2 votes

J'utiliserais quelque chose comme http ://mycompany.com/api/v1/getproducts?ids=[listofids]

1 votes

Comment une question sur la conception d'une API peut-elle faire double emploi avec une question sur les détails de l'implémentation dans Rails ?

189voto

abraham Points 19107

Je vous recommande de penser à cela comme à une liste de représentations multiples de la ressource filtrée par id. En tant que tel, vous faites un GET à la ressource de base :

https://example.com/api/v1/products

Et filtrez la liste des réponses par id :

https://example.com/api/v1/products?id=1,2,3

36 votes

C'est la meilleure réponse à mon avis, pour la raison suivante : /products y products?id=1,2,3 donnera cohérent réponses (=ressources de collecte). Comparaison de /products/1 y /products/1,2,3 est une recette pour les maux de tête des clients - à moins, bien sûr, que tous les points de terminaison imbriqués ne renvoient des collections par défaut (ce qui est également une approche intéressante, pour un exemple, voir l'application api+json format)

2 votes

J'aime cette approche, mais ne devrait-elle pas être exemple.com/api/v1/produits?id=1&id=2&id=3 ?

9 votes

@Nitek Non ; il n'y a aucune garantie que les paramètres de requête dupliqués seront combinés dans un tableau. Pour votre exemple d'URL, PHP vous dira en effet que id est égal à [1, 2, 3] mais Ruby on Rails vous dirait que cela équivaut à 3 et d'autres cadres peuvent également agir différemment, par exemple en disant id est égal à 1 .

66voto

aldrin Points 2452

Votre suggestion d'utiliser des identifiants séparés par des virgules est suffisante.

Il serait instructif d'examiner certaines API REST publiques pour voir comment elles se comportent. Par exemple, l'API de StackExchange sépare les identifiants par un point-virgule. https://api.stackexchange.com/docs/answers-by-ids

1 votes

Je me demande pourquoi les gens n'utilisent pas les produits ?id[]=1&id[]=2. Les analyseurs d'URL gèrent cela très bien.

13 votes

@JulioGreff Je pense que c'est parce que c'est un peu laid. Aucune autre raison particulière.

7 votes

@JulioGreff Les interfaces de programmation RESTful ne sélectionnent pas seulement par l'identifiant, elles décorent également. exemple /api/dogs/fluffy1234 pourrait être étendu pour faire plus de choses comme ça : /api/dogs/fluffy1234/siblings Ainsi, si vous pouvez conserver la logique du sélecteur au même endroit que l'ID, vous pouvez toujours utiliser vos décorateurs.

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