Jak mogę pobrać wszystkie parametry zapytania w Jersey JaxRS?

91

Buduję ogólną usługę internetową i muszę pobrać wszystkie parametry zapytania w jeden ciąg do późniejszego przeanalizowania. Jak mogę to zrobić?

Tomek
źródło

Odpowiedzi:

163

Możesz uzyskać dostęp do pojedynczego parametru poprzez @QueryParam("name")lub do wszystkich parametrów poprzez kontekst:

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

Kluczem jest @Context adnotacja jax-rs , do której można uzyskać dostęp:

UriInfo, Request, HttpHeaders, SecurityContext, Providers

jego młodość
źródło
Czy możemy używać z GET?
czuć się dobrze i programować
33

Niezanalizowaną część zapytania URI żądania można uzyskać z UriInfoobiektu:

@GET
public Representation get(@Context UriInfo uriInfo) {
  String query = uriInfo.getRequestUri().getQuery();
  ...
}
glerup
źródło
4

Dodanie nieco więcej do zaakceptowanej odpowiedzi. Możliwe jest również pobranie wszystkich parametrów zapytania w następujący sposób bez dodawania dodatkowego parametru do metody, co może być przydatne przy utrzymywaniu dokumentacji 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
źródło
Chociaż to działa, nie polecałbym tego. Jeśli potrafisz zachować funkcjonalność kodu, powinieneś spróbować - to lepsze podejście.
martyglaubitz
1
Chociaż jest to ściśle poprawne, używam tego podejścia z nadklasą do automatycznego rejestrowania parametrów i działa bardzo ładnie. Znacznie czystsze niż przekazywanie parametrów przy każdym żądaniu. Czasami czystość funkcjonalna wymaga tylko spojrzenia w drugą stronę przez kilka sekund, podczas gdy pragmatyczne programowanie przejmuje kontrolę nad klawiaturą :)
Paul Russell