146 votes

Comment construire une API REST qui prend un tableau d'identifiants pour les ressources ?

Je suis en train de créer une API REST pour mon projet. L'API pour obtenir l'INFO d'un utilisateur donné est la suivante :

api.com/users/[USER-ID]

J'aimerais également permettre au client de transmettre une liste d'identifiants d'utilisateur. Comment puis-je construire l'API de manière à ce qu'elle soit RESTful et reçoive une liste d'identifiants d'utilisateurs ?

118voto

Florin Dumitrescu Points 3501

Si vous transmettez tous vos paramètres dans l'URL, les valeurs séparées par des virgules sont probablement le meilleur choix. Vous auriez alors un modèle d'URL comme le suivant :

api.com/users?id=id1,id2,id3,id4,id5

45voto

Nilesh Points 864
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

IMO, les appels ci-dessus ne semblent pas RESTful, mais ce sont des solutions rapides et efficaces (y). Mais la longueur de l'URL est limitée par le serveur web, par ex. tomcat .

Tentative de RESTful :

POST http://example.com/api/batchtask

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]

Le serveur répondra à l'URI de la nouvelle création batchtask ressource.

201 Created
Location: "http://example.com/api/batchtask/1254"

Maintenant, le client peut récupérer la réponse du lot ou la progression de la tâche par sondage.

GET http://example.com/api/batchtask/1254


C'est ainsi que d'autres ont tenté pour résoudre ce problème :

26voto

Shuja Points 94

Je trouve un autre moyen de faire la même chose en utilisant @PathParam . Voici l'exemple de code.

@GET
@Path("data/xml/{Ids}")
@Produces("application/xml")
public Object getData(@PathParam("zrssIds") String Ids)
{
  System.out.println("zrssIds = " + Ids);
  //Here you need to use String tokenizer to make the array from the string.
}

Appelez le service en utilisant l'url suivante.

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76

24voto

Kyristopher Points 355

Même si je préfère cette approche:-

    api.com/users?id=id1,id2,id3,id4,id5

La manière correcte est

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

o

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5

C'est ainsi que rack le fait. C'est ainsi que php le fait. C'est aussi la façon dont node le fait...

0voto

Reinsbrain Points 166

Il semble y avoir plusieurs façons d'y parvenir. J'aimerais vous expliquer comment j'y arrive :

GET /users/<id>[,id,...]

Il y a une limitation sur le nombre d'identifiants qui peuvent être spécifiés à cause des limites de longueur des URI - ce que je trouve une bonne chose pour éviter les abus.

Je préfère utiliser les paramètres de chemin pour les ID et garder les paramètres de chaîne de requête dédiés aux filtres. Cela maintient l'aspect RESTful en garantissant que le document répondant à l'URI peut toujours être considéré comme une ressource et que les paramètres de la chaîne de requête ne sont pas utilisés. pourrait peut toujours être mis en cache (bien qu'il y ait quelques obstacles à franchir pour le mettre en cache efficacement).

Je suis intéressé par les commentaires dans ma chasse à la solution idéale pour ce formulaire :)

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