Manejo de Múltiples Parámetros de Consulta en Jersey
En el servicio web en el que estoy trabajando, necesito implementar un URI con parámetros de consulta que se vean como /stats?store=A&store=B&item=C&item=D
Para desglosarlo, necesito poder usar parámetros de consulta para especificar datos de múltiples/todos los almacenes y datos para múltiples/todos los elementos de esos almacenes. Hasta ahora he podido implementar un argumento de consulta muy bien para extraer datos de elementos, pero estoy perdido en cuanto a cómo implementar más consultas, y parece que no puedo encontrar los recursos que había visto antes en qué trato con esta implementación.
Lo que tengo hasta ahora en mi método es a lo largo de las líneas de
@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
/**Run data using item as variable**/
return someStringOfData
}
Que funciona bien para un elemento, y devolverá todos los datos si no escribo el parámetro en el URI. Sin embargo, no estoy seguro de cómo manejar más parámetros que este.
Actualización :
He descubierto cómo usar 2 parámetros diferentes simplemente agregando un segundo argumento al método de la siguiente manera:
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
@DefaultValue("All") @QueryParam(value = "item") final String item)
La pregunta sigue siendo cómo implementar múltiples valores del mismo parámetro.
3 answers
Si cambia el tipo de su parámetro de método item
de String
a una colección como List<String>
, debería obtener una colección que contenga todos los valores que está buscando.
@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All")
@QueryParam(value = "item")
final List<String> item) {
return "values are " + item;
}
La especificación JAX-RS (sección 3.2) dice lo siguiente con respecto a la anotación @QueryParam
:
Se admiten los siguientes tipos:
- Tipos primitivos
- Tipos que tienen un constructor que acepta un único argumento
String
.- Tipos que tienen un método estático llamado
valueOf
con un único argumentoString
.List<T>
,Set<T>
, oSortedSet<T>
dondeT
satisface 2 o 3 arriba.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-27 20:03:24
List<String> items=ui.getQueryParameters().get("item");
Donde ui
se declara como miembro en el recurso rest de la siguiente manera:
@Context UriInfo ui;
La desventaja es que no aparece en los argumentos de los métodos en absoluto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 09:09:34
Algunas libs como axios js usan la notación entre corchetes al enviar una solicitud param de múltiples valores: / stats?store [] = A & store [] = B & item [] = C & item[]=D
Para manejar todos los casos (con o sin corchetes) puede agregar otro parámetro como este:
public String methodImCalling(
@QueryParam(value = "store") final List<String> store,
@QueryParam(value = "store[]") final List<String> storeWithBrackets,
@QueryParam(value = "item") final List<String> item,
@QueryParam(value = "item[]") final List<String> itemWithBrackets) {
...
}
Inspeccionando cada uno de los argumentos comprobando null.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 19:45:29