Comment puis-je récupérer tous les paramètres de requête dans Jersey JaxRS?

91

Je construis un service Web générique et j'ai besoin de saisir tous les paramètres de requête dans une chaîne pour une analyse ultérieure. Comment puis-je faire ceci?

À M
la source

Réponses:

163

Vous pouvez accéder à un seul paramètre via @QueryParam("name")ou à tous les paramètres via le contexte:

@POST
public Response postSomething(@QueryParam("name") String name, @Context UriInfo uriInfo, String content) {
     MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters(); 
     String nameParam = queryParams.getFirst("name");
}

La clé est l' @Context annotation jax-rs , qui peut être utilisée pour accéder:

UriInfo, Request, HttpHeaders, SecurityContext, Fournisseurs

sa gentillesse
la source
Pouvons-nous utiliser avec GET?
feel good et programmation du
33

La partie requête non analysée de l'URI de la requête peut être obtenue à partir de l' UriInfoobjet:

@GET
public Representation get(@Context UriInfo uriInfo) {
  String query = uriInfo.getRequestUri().getQuery();
  ...
}
glerup
la source
4

Ajout d'un peu plus à la réponse acceptée. Il est également possible d'obtenir tous les paramètres de requête de la manière suivante sans ajouter de paramètre supplémentaire à la méthode, ce qui peut être utile lors de la maintenance de la documentation swagger.

@Context
private UriInfo uriInfo;

@POST
public Response postSomething(@QueryParam("name") String name) {
     MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters(); 
     String nameParam = queryParams.getFirst("name");
}

réf

Janak
la source
Bien que cela fonctionne, je ne le recommanderais pas. Si vous pouvez garder le code fonctionnel pur, vous devriez l'essayer - c'est la meilleure approche.
martyglaubitz
1
Bien que strictement correct, j'utilise cette approche avec une superclasse pour enregistrer automatiquement les paramètres, et cela fonctionne très bien. Beaucoup plus propre que de devoir passer les paramètres à chaque demande. Parfois, la pureté fonctionnelle doit simplement regarder dans l'autre sens pendant quelques secondes tandis que la programmation pragmatique prend le contrôle du clavier :)
Paul Russell