web-dev-qa-db-fra.com

Gestion de plusieurs paramètres de requête dans Jersey

Dans le service Web sur lequel je travaille, je dois implémenter un URI avec des paramètres de requête qui ressemblent à /stats?store=A&store=B&item=C&item=D

Pour le décomposer, je dois pouvoir utiliser des paramètres de requête pour spécifier les données de plusieurs/tous les magasins et les données pour plusieurs/tous les articles de ces magasins. Jusqu'à présent, j'ai été en mesure d'implémenter un argument de requête très bien afin d'extraire des données d'article, mais je suis perdu quant à la façon d'implémenter plus de requêtes, et je n'arrive pas à trouver les ressources que j'avais vues avant quel accord avec cette mise en œuvre.

Ce que j’ai jusqu’à présent dans ma méthode va dans le sens de

@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
    /**Run data using item as variable**/
    return someStringOfData
}

qui fonctionne bien pour un élément et renverra toutes les données si je ne tape pas le paramètre dans l'URI. Cependant, je ne sais pas comment gérer plus de paramètres que cela.

Mise à jour:

J'ai compris comment utiliser 2 paramètres différents en ajoutant simplement un deuxième argument à la méthode comme ceci:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
    @DefaultValue("All") @QueryParam(value = "item") final String item)

La question demeure de savoir comment implémenter plusieurs valeurs du même paramètre.

38
ZKSteffel

Si vous changez le type de votre paramètre de méthode item de String en une collection telle que List<String>, vous devriez obtenir une collection contenant toutes les valeurs que vous recherchez.

@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All") 
                              @QueryParam(value = "item") 
                              final List<String> item) {
   return "values are " + item;
}

La spécification JAX-RS (section 3.2) dit ce qui suit concernant le @QueryParam annotation:

Les types suivants sont pris en charge:
  1. Types primitifs
  2. Types dont le constructeur accepte un seul argument String.
  3. Types qui ont une méthode statique nommée valueOf avec un seul argument String.
  4. List<T>, Set<T>, ou SortedSet<T>T satisfait 2 ou 3 ci-dessus.
76
stand

List<String> items=ui.getQueryParameters().get("item");

ui est déclaré comme membre dans la ressource rest comme ceci:

@Context UriInfo ui;

l'inconvénient est qu'il n'apparaît pas du tout dans les arguments des méthodes.

9
Tal

Certaines bibliothèques comme axios js utilisent la notation entre crochets lors de l'envoi d'une demande de paramètre à valeurs multiples:/stats? Store [] = A & store [] = B & item [] = C & item [] = D

Pour gérer tous les cas (avec ou sans crochets), vous pouvez ajouter un autre paramètre comme celui-ci:

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) {
...
}

Inspecter chacun des arguments en vérifiant la valeur null.

2
matias.g.rodriguez