2011-07-28 13 views
74

Jak mogę wyświetlić faktyczne żądanie, które Jersey generuje i wysyła na serwer? Mam problemy z konkretną prośbą, a użytkownik, który uruchomił serwer, poprosił o wyświetlenie pełnego żądania (z nagłówkami i podobnymi).Jersey: Wydrukuj aktualne żądanie.

+3

do logowania na stronie serwera zobaczyć następujący wpis: [Jak dostać logi jersey na serwerze?] [1] [1]: https://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server – eeezyy

Odpowiedz

92

Jeśli jesteś po prostu za pomocą Jersey API Client, LoggingFilter (klient) filtra powinna pomóc:

Client client = Client.create(); 
client.addFilter(new LoggingFilter(System.out)); 
WebResource webResource = client.resource("http://localhost:9998/"); 
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON) 
             .get(ClientResponse.class); 

W przeciwnym razie, można ponownie zalogować zarówno żądanie i odpowiedź na serwerze przy użyciu innych (filtr kontenera) LoggingFilter.

+4

Ta metoda 'addFilter' nie istnieje w Jersey 2.x. Jak używasz tego teraz? –

+2

JAX-RS 2.x zapewnia funkcjonalność równoważną z zastrzeżonym API klienta Jersey 1.x. Więcej szczegółów: https://jersey.java.net/documentation/latest/user-guide.html#mig-client-api –

+0

Osoby zainteresowane dostosowywaniem danych wyjściowych dziennika mogą utworzyć własne narzędzie LoggingFilter http: // stackoverflow. com/questions/30187514/how-to-log-request-body-in-jax-rs-client – nacho4d

46

@ Odpowiedź ivan.cikic dotyczy Jersey 1.x. Oto jak to zrobić w Jersey 2.x:

import org.glassfish.jersey.client.ClientConfig; 
import org.glassfish.jersey.filter.LoggingFilter; 
import org.json.JSONException; 
import org.json.JSONObject; 

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.Form; 
import javax.ws.rs.core.MediaType; 

... 

     ClientConfig config = new ClientConfig(); 

     Client client = ClientBuilder.newClient(config); 
     client.register(new LoggingFilter()); 

To nie ma znaczenia, ale ja po prostu mieć narzekać: Nowy LoggingFilter jest naprawdę irytujące, ponieważ zmusza do korzystania Java Util Logging. Byłoby lepiej, gdyby dał mi kontrolę nad loggerem. Wygląda jak krok wstecz w projektowaniu.

+2

Wiem, że to stara odpowiedź, ale mam pytanie - czy wiesz, jak zmusić rejestratora do drukowania WSZYSTKICH informacje zawarte we wniosku? W szczególności pliki cookie. Użyłem konstruktora 'LoggingFilter (Logger Logger, boolean PrintEntity)', ale nawet to nie wypisze plików cookie. – bkaiser

+0

LoggingFilter jest teraz przestarzałe. Powinieneś użyć odpowiedzi Martina na LoggingFeature. Umożliwia to również wyliczenie szczegółowości w celu wydrukowania różnej ilości szczegółów. Powinien wydrukować nagłówki, które powinny zawierać pliki cookie. –

31

Od Jersey 2.23, można użyć LoggingFeature. Oto nieco uproszczony przykład, pamiętaj, że możesz również zarejestrować tę funkcję na WebTarget.

Logger logger = Logger.getLogger(getClass().getName()); 

Feature feature = new LoggingFeature(logger, Level.INFO, null, null); 

Client client = ClientBuilder.newBuilder() 
     .register(feature) 
     .build(); 

Response response = client.target("https://www.google.com") 
     .queryParam("q", "Hello, World!") 
     .request().get(); 

JavaDoc z LoggingFeature mówi, że wniosek "i/lub" odpowiedź jest zalogowany lol. Na moim komputerze oba są logowane.

+0

To działa świetnie dla wersji Jersey 2.25, ale w wersji 2.7, której używam, pakiet "rejestrowania" nie jest już zlokalizowany w org.glassfish.jersey.core: jersey-common. Czy wiesz, do którego pakietu został przeniesiony w 2.7? – Tim

+0

Zobacz odpowiedź @ Daniela Kaplana poniżej .. – Neo