web-dev-qa-db-fra.com

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

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

api.com/users/[USER-ID]

J'aimerais également autoriser le client à transmettre une liste d'identifiants d'utilisateurs. Comment puis-je construire l'API de sorte qu'elle soit RESTful et prenne une liste d'ID utilisateur?

84
uclajatt

Si vous transmettez tous vos paramètres à l'URL, des valeurs séparées par des virgules seraient probablement le meilleur choix. Ensuite, vous auriez un modèle d'URL du type suivant:

api.com/users?id=id1,id2,id3,id4,id5
83
Florin Dumitrescu
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

OMI, les appels ci-dessus ne semble pas RESTful, mais il s'agit d'une solution de contournement rapide et efficace (y). Mais la longueur de l'URL est limitée par le serveur Web, par exemple Tomcat

Tentative de repos:

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 ressource batchtask nouvellement créée.

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

Maintenant, le client peut récupérer une réponse par lot ou l'avancement d'une tâche par une interrogation

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


Voici comment d'autres ont tenté de résoudre ce problème:

24
Nilesh

Je trouve une autre façon 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
16
Shuja

Autant que je préfère cette approche: - 

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

La bonne façon 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

Voici comment rack le fait. Voici comment php le fait. Voici comment le noeud le fait aussi ...

14
Kyristopher

Vous pouvez créer une API Rest ou un projet reposant à l'aide d'ASP.NET MVC et renvoyer des données au format 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'identifiants (dans ce cas, jQuery stringify est utilisé pour envoyer le tableau sous forme de chaîne et le dématérialiser dans le contrôleur d'ints et le recevoir comme un tableau d'int dans le contrôleur). J'ai créé une API Restful entière à l'aide d'ASP.NET MVC, qui renvoie les données sous forme de json interdomaine et pouvant être utilisées à partir de n'importe quelle application. 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
Vasile Laur