2010-12-27 22 views

Respuesta

74

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

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

El problema con este enfoque es que duerma' parece reparador. Por ejemplo, si quiero obtener los amigos de esta lista de usuarios – uclajatt

+6

@uclajatt, REST es un modelo arquitectónico y no un protocolo, y si estudia las principales API REST disponibles hoy en día, verá que hay múltiples formas de implementarlo. El enfoque que estoy sugiriendo es probablemente uno de los más cercanos al concepto, ya que cumple con todas las restricciones descritas aquí: http://en.wikipedia.org/wiki/Representational_State_Transfer#Constraints. Solo usaría CSV para representar matrices en las solicitudes, mientras que las respuestas del servicio deberían ser serializadas usando XML o JSON. ¿Hay alguna razón particular por la que no consideras que mi enfoque sea REST? –

+3

La respuesta de Florin es la forma real en que utiliza la API de OpenSocial. – Emerald214

0

Se puede construir una API REST o un proyecto reparador con ASP.NET MVC y devolver datos como JSON. Un ejemplo de función del controlador sería:

 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)); 
     } 

A continuación, sólo llama a la función GetUsers través de una función de AJAX abastecimiento regular la matriz de ID (en este caso estoy usando jQuery stringify para enviar la matriz como cuerda y desmaterializar se de vuelta en el controlador, pero puede enviar la matriz de entradas y recibirla 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" 
      }); 
    } 
+3

Lo siento, no estaba 'preguntando cómo implementar la API. solo preguntaba cómo construir el URI de la API para que el cliente pueda acceder a la información sobre un conjunto de usuarios. Puedo pasar los ID a través de los parámetros de consulta, pero creo que no será muy tranquilo. – uclajatt

+0

@uclajatt ¿Por qué crees que eso no es RESTful? –

+1

Creo que pasar los id o cualquier otro valor a través de los parámetros de consulta es un enfoque tranquilo para interactuar con un sistema. Cómo construyes tu Uri depende de ti. Al ser usuarios/todos, usuarios/matriz, matriz/usuarios o cualquier otra convención de nombres, usted siente que tiene sentido. Tener en cuenta cómo funciona el framework MVC es muy fácil de usar para crear una API relajante, ya que puedes organizar y construir tu Uris tal como lo necesitas.Una vez que tenga su Uris, puede pasar sus parámetros usando AJAX como una cadena, o como valores múltiples si está utilizando un formulario y haciendo una publicación en una acción de MVC. –

14

Otra forma de hacer lo mismo es usar @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. 
} 

Llama al servicio utilizando la siguiente url.

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

donde

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

Me gusta esta porque el GET es consistente. Puede usar un número o muchos en este ejemplo. Y no es realmente una búsqueda (parámetros), ya que le está dando al back end los identificadores exactos que desea. – markthegrea

14

Por mucho que yo prefiero 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 rack lo hace. Así es como lo hace php. Así es como nodo lo hace así ...

+13

No estoy seguro de que hacer referencia a los estándares de PHP como una guía a seguir sea el mejor consejo. https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/ – trebor

+1

Así es como angular (google) también –

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

OMI, llamadas antes mencionadas no parece que va REST, sin embargo, estos son rápida y eficiente solución (y). Pero la longitud de la URL está limitada por el servidor web, por ejemplo, tomcat.

intento REST:

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

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

servidor responderá URI del recién creado batchtask recursos.

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

cliente Ahora puede ir a buscar la respuesta por lotes o progreso de la tarea mediante el sondeo

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


Esta es la forma en que otros intentaron para resolver este problema:

+2

La solicitud POST a _get_ resultados múltiples no es RESTful . Su ejemplo muestra la creación de un recurso, donde es apropiado POST, pero ese es un caso totalmente diferente al de la pregunta original – Anentropic

+2

La creación de un recurso temporal es RESTful, ¿o no? Y obtengo recursos usando GET, de nuevo es RESTful. – Nilesh

+0

sí, pero nada de eso estaba en la pregunta original, que solo pregunta acerca de cómo obtener información para múltiples ID de usuario – Anentropic

Cuestiones relacionadas