Como posso obter todos os parâmetros de consulta em Jersey JaxRS?

91

Estou construindo um serviço web genérico e preciso reunir todos os parâmetros de consulta em uma string para análise posterior. Como posso fazer isso?

Tom
fonte

Respostas:

162

Você pode acessar um único parâmetro @QueryParam("name")ou todos os parâmetros por meio do contexto:

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

A chave é a @Context anotação jax-rs , que pode ser usada para acessar:

UriInfo, Request, HttpHeaders, SecurityContext, Providers

sua atração
fonte
Podemos usar com GET?
sinta
33

A parte da consulta não analisada do URI de solicitação pode ser obtida do UriInfoobjeto:

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

Adicionando um pouco mais à resposta aceita. Também é possível obter todos os parâmetros de consulta da seguinte maneira, sem adicionar um parâmetro adicional ao método que pode ser útil ao manter a documentação swagger.

@Context
private UriInfo uriInfo;

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

ref

Janak
fonte
Embora funcione, eu não o recomendaria. Se você pode manter o código funcional puro, deve tentar - é a melhor abordagem.
martyglaubitz de
1
Embora estritamente correto, estou usando essa abordagem com uma superclasse para registrar automaticamente os parâmetros e funciona muito bem. Muito mais limpo do que passar os parâmetros a cada solicitação. Às vezes, a pureza funcional precisa apenas olhar para o outro lado por alguns segundos enquanto a programação pragmática assume o controle do teclado :)
Paul Russell