Wie kann ich alle Abfrageparameter in Jersey JaxRS abrufen?

91

Ich erstelle einen generischen Webdienst und muss alle Abfrageparameter für eine spätere Analyse in einer Zeichenfolge zusammenfassen. Wie kann ich das machen?

Tom
quelle

Antworten:

162

Sie können @QueryParam("name")über den Kontext auf einen einzelnen Parameter oder auf alle Parameter zugreifen:

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

Der Schlüssel ist die @Context jax-rs-Annotation , mit der auf Folgendes zugegriffen werden kann:

UriInfo, Request, HttpHeaders, SecurityContext, Providers

Hisdrewness
quelle
Können wir mit GET verwenden?
Wohlfühlen und Programmieren
33

Der nicht analysierte Abfrageteil des Anforderungs-URI kann vom UriInfoObjekt abgerufen werden:

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

Der akzeptierten Antwort etwas mehr hinzufügen. Es ist auch möglich, alle Abfrageparameter auf folgende Weise abzurufen, ohne der Methode einen zusätzlichen Parameter hinzuzufügen, was bei der Pflege der Swagger-Dokumentation hilfreich sein kann.

@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
quelle
Während dies funktioniert, würde ich es nicht empfehlen. Wenn Sie den Code funktionsfähig halten können, sollten Sie es versuchen - es ist der bessere Ansatz.
Martyglaubitz
1
Obwohl streng korrekt, verwende ich diesen Ansatz mit einer Superklasse, um Parameter automatisch zu protokollieren, und er funktioniert sehr gut. Viel sauberer, als die Parameter bei jeder Anfrage übergeben zu müssen. Manchmal muss die funktionale Reinheit nur ein paar Sekunden lang wegschauen, während die pragmatische Programmierung die Kontrolle über die Tastatur übernimmt :)
Paul Russell