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

je construis une API REST pour mon projet. L'API pour obtenir les informations d'un utilisateur donné est:

api.com/users/[USER-ID]

je voudrais également permettre au client de passer dans une liste d'ID d'utilisateur. Comment puis-je construire L'API de manière à ce qu'elle soit RESTful et prenne en compte une liste d'ID utilisateur?

78
demandé sur Keith Pinson 2010-12-27 22:48:03

5 réponses

si vous passez tous vos paramètres sur L'URL, alors probablement les valeurs séparées par des virgules seraient le meilleur choix. Vous auriez alors un modèle D'URL comme celui-ci:

api.com/users?id=id1,id2,id3,id4,id5
80
répondu Florin Dumitrescu 2010-12-27 20:04:18
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

IMO, ci-dessus appels ne semble pas reposant, mais ceux-ci sont une solution rapide et efficace (y). Mais la longueur de L'URL est limitée par le serveur web, par exemple tomcat .

"151990920 de" repos tentative:

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

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

serveur répondra URI de nouvellement créé batchtask ressource.

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

maintenant le client peut obtenir la réponse de lot ou la tâche progrès par sondage

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


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

24
répondu Nilesh 2017-05-23 12:03:07

je trouve une autre façon de faire la même chose en utilisant @PathParam . Voici l'échantillon 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
15
répondu Shuja 2011-12-04 09:45:41

autant Que je préfère cette approche:-

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

le bon chemin est

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

ou

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

C'est comme ça que rack le fait. C'est ainsi que php le fait. C'est ainsi que le noeud le fait aussi...

14
répondu Kyristopher 2017-05-23 11:47:20

vous pouvez construire une API Rest ou un projet restful en utilisant ASP.NET MVC et renvoie les données en JSON. Un exemple de fonction de contrôleur serait:

        public JsonpResult GetUsers(string userIds)
        {
           var values = JsonConvert.DeserializeObject<List<int>>(userIds);

            var users = _userRepository.GetAllUsersByIds(userIds);

            var collection = users.Select(user => new { id = user.Id, fullname = user.FirstName +" "+ user.LastName });
            var result = new { users = collection };

            return this.Jsonp(result);
        }
        public IQueryable<User> GetAllUsersByIds(List<int> ids)
        {
            return _db.Users.Where(c=> ids.Contains(c.Id));
        }

ensuite vous appelez simplement la fonction GetUsers via une fonction AJAX régulière fournissant le tableau D'Ids (dans ce cas, j'utilise jQuery stringify pour envoyer le tableau sous forme de chaîne de caractères et le dématérialiser dans le contrôleur mais vous pouvez simplement envoyer le tableau d'ints et le recevoir sous forme de tableau d'int dans le contrôleur). J'ai construisez une API Restful entière en utilisant ASP.NET MVC qui renvoie les données comme JSON de domaine croisé et qui peut être utilisé à partir de n'importe quelle application. Cela, bien sûr, si vous pouvez utiliser ASP.NET MVC.

function GetUsers()
    {
           var link = '<%= ResolveUrl("~")%>users?callback=?';
           var userIds = [];
            $('#multiselect :selected').each(function (i, selected) {
                userIds[i] = $(selected).val();
            });

            $.ajax({
                url: link,
                traditional: true,
                data: { 'userIds': JSON.stringify(userIds) },
                dataType: "jsonp",
                jsonpCallback: "refreshUsers"
            });
    }
0
répondu Vasile Laur 2010-12-27 20:43:52