Cómo construir una API REST que tome una matriz de id para los recursos

Estoy construyendo una API REST para mi proyecto. La API para obtener INFO de un usuario dado es:

api.com/users/[USER-ID] 

También me gustaría permitir que el cliente pase una lista de ID de usuario. ¿Cómo puedo construir la API para que sea RESTful y toma una lista de ID de usuario?

Si está pasando todos sus parámetros en la URL, probablemente los valores separados por comas serían la mejor opción. Entonces, tendrías una plantilla de URL como la siguiente:

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

IMO, las llamadas anteriores no parecen RESTful, sin embargo, estas son soluciones rápidas y eficientes (y). Pero la longitud de la URL está limitada por el servidor web, por ejemplo, tomcat .

Intento RESTful:

 POST http://example.com/api/batchtask [ { method : "GET", headers : [..], url : "/users/id1" }, { method : "GET", headers : [..], url : "/users/id2" } ] 

El servidor responderá el URI del recurso batchtask recién creado.

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

Ahora el cliente puede obtener la respuesta del lote o el progreso de la tarea mediante sondeo

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


Así es como otros intentaron resolver este problema:

  • Google Drive
  • Facebook
  • Microsoft
  • Subbu Allamaraju

Encuentro otra forma de hacer lo mismo usando @PathParam . Aquí está la muestra del código.

 @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. } 

Llame al servicio utilizando la siguiente url.

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

dónde

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

Por mucho que prefiera este enfoque:

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

La forma correcta es

  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 

Así es como lo hace rack . Así es como php lo hace. Así es como nodo también lo hace …

Puede crear una API de reposo o un proyecto relajante utilizando ASP.NET MVC y devolver datos como JSON. Una función de controlador de ejemplo sería:

  public JsonpResult GetUsers(string userIds) { var values = JsonConvert.DeserializeObject>(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 GetAllUsersByIds(List ids) { return _db.Users.Where(c=> ids.Contains(c.Id)); } 

Luego solo llama a la función GetUsers a través de una función AJAX regular que suministra la matriz de Ids (en este caso estoy usando jQuery stringify para enviar la matriz como una cadena y desmaterializarla de nuevo en el controlador, pero puedes enviar la matriz de entradas y recibir como una matriz de int en el controlador). Construí una API Restful completa utilizando ASP.NET MVC que devuelve los datos como dominio cruzado json y que se pueden usar desde cualquier aplicación. Eso por supuesto si puedes usar 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" }); }