Jersey: wydrukuj rzeczywiste żądanie

88

Jak mogę zobaczyć rzeczywiste żądanie, które Jersey generuje i wysyła do serwera? Mam problemy z konkretnym żądaniem, a osoba obsługująca serwer internetowy poprosiła o wyświetlenie pełnego żądania (z nagłówkami i tym podobnymi).

Bezplanowo
źródło
3
do logowania po stronie serwera zobacz następujący post: [Jak zdobyć logi z koszulki na serwerze?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Odpowiedzi:

100

Jeśli używasz tylko Jersey Client API, LoggingFilter (filtr klienta) powinien 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żesz ponownie rejestrować zarówno żądanie, jak i odpowiedź na serwerze przy użyciu innego LoggingFilter (filtru kontenera).

ivan.cikic
źródło
5
Ta addFiltermetoda nie istnieje w Jersey 2.x. Jak teraz tego używasz?
Daniel Kaplan,
2
JAX-RS 2.x zapewnia funkcjonalność odpowiadającą zastrzeżonemu klientowi API Jersey 1.x. Więcej szczegółów: jersey.java.net/documentation/latest/…
ivan.cikic
Osoby zainteresowane dostosowywaniem danych wyjściowych dziennika mogą utworzyć własny LoggingFilter stackoverflow.com/questions/30187514/ ...
nacho4d
55

Od Jersey 2,23 , tam LoggingFeaturemożna użyć. Poniższy przykład jest nieco uproszczony, pamiętaj, że możesz również zarejestrować tę funkcję 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 of LoggingFeaturemówi, że żądanie „i / lub” odpowiedź jest rejestrowane lol. Na moim komputerze oba są rejestrowane.

Martin Andersson
źródło
Działa to świetnie w przypadku Jersey 2.25, ale w wersji 2.7, której używam, pakiet „logging” nie znajduje się już w org.glassfish.jersey.core: jersey-common. Czy wiesz, do którego pakietu został przeniesiony w wersji 2.7?
Tim
Nie powoduje to wydrukowania treści żądania lub odpowiedzi. Pokazuje tylko nagłówki
David Brossard
2
@DavidBrossard Użyj org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY jako parametru konstruktora, aby to kontrolować.
AxelW,
51

Odpowiedź @ ivan.cikic dotyczy Jersey 1.x. Oto, jak to się robi 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 po prostu mają na co narzekać: Nowa LoggingFilterjest naprawdę irytujące, ponieważ zmusza do korzystania Java Util Logging. Byłoby lepiej, gdyby dał mi kontrolę nad rejestratorem. Wygląda na krok wstecz w projektowaniu.

Daniel Kaplan
źródło
3
Wiem, że to stara odpowiedź, ale mam pytanie - czy wiesz, jak sprawić, by logger wydrukował WSZYSTKIE informacje zawarte w zapytaniu? W szczególności pliki cookie. Użyłem LoggingFilter(Logger logger, boolean PrintEntity)konstruktora, ale nawet to nie drukuje plików cookie.
bkaiser
2
LoggingFilter jest teraz przestarzały. Powinieneś użyć odpowiedzi Martina w LoggingFeature. Obsługuje to również wyliczenie gadatliwości umożliwiające wydrukowanie różnej ilości szczegółów. Powinien wydrukować nagłówki, które powinny zawierać pliki cookie.
Dan Hardiker,
Z jakiegoś powodu LoggingFeaturenic nie drukuje i LoggingFilterdrukuje ... 🤷‍♂️
Ferran Maylinch
0

Wszystkie te odpowiedzi są dość zbliżone, ale brakuje im ustawienia do rejestrowania treści żądania i odpowiedzi. Przynajmniej w przypadku Jersey 2.30.1 rejestruję żądanie i odpowiedź, w tym ich odpowiednie organy:

import javax.ws.rs.client.ClientBuilder;
import org.glassfish.jersey.logging.LoggingFeature;
import java.util.logging.Level;
import java.util.logging.Logger;

Logger logger = Logger.getLogger("LoggingFeature");
logger.setLevel(Level.ALL);
ClientBuilder.newClient()
  .target("https://www.example.com")
  .register(new LoggingFeature(
    logger,
    Level.ALL,
    LoggingFeature.Verbosity.PAYLOAD_ANY,
    8192))
  .request()
  .get();

Technicznie rzecz biorąc, wartości Level.Alli 8192mogą być null. Podaję je tutaj, aby były zwięzłe.

james.lorenzen
źródło