Jersey: stampa la richiesta effettiva


88

Come posso visualizzare la richiesta effettiva che Jersey genera e invia al server? Sto riscontrando problemi con una richiesta particolare e il collega che gestisce il server Web ha chiesto di vedere la richiesta completa (con intestazioni e simili).


3
per la registrazione al lato server vedere il seguente post: [Come ottenere i log sul server di jersey?] [1] [1]: stackoverflow.com/questions/2332515/...
eeezyy

Risposte:


100

Se stai usando solo Jersey Client API, LoggingFilter (filtro client) dovrebbe aiutarti:

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);

In caso contrario, è possibile registrare nuovamente sia la richiesta che la risposta sul server utilizzando un altro LoggingFilter (filtro contenitore).


5
Questo addFiltermetodo non esiste in Jersey 2.x. Come lo usi adesso?
Daniel Kaplan

2
JAX-RS 2.x fornisce funzionalità equivalenti all'API client proprietaria Jersey 1.x. Maggiori dettagli: jersey.java.net/documentation/latest/…
ivan.cikic

Per le persone interessati a personalizzare l'output di log, che possono creare il proprio LoggingFilter stackoverflow.com/questions/30187514/...
nacho4d

55

A partire da Jersey 2.23 , LoggingFeaturepuoi usare un file. Quello che segue è un esempio leggermente semplificato, tieni presente che puoi anche registrare la funzione 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 di LoggingFeaturedice che la richiesta "e / o" la risposta viene registrata lol. Sulla mia macchina vengono registrati entrambi.


Funziona benissimo per Jersey 2.25 ma in 2.7 che sto usando, il pacchetto "logging" non si trova più all'interno di org.glassfish.jersey.core: jersey-common. Sai in quale pacchetto è stato spostato nella 2.7?
Tim,

Questo non stampa il corpo della richiesta o della risposta. Mostra solo le intestazioni
David Brossard

2
@DavidBrossard Usa org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY come parametro del costruttore per controllarlo.
AxelW

51

La risposta di @ ivan.cikic è per Jersey 1.x. Ecco come lo fai in 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());

Questo è irrilevante, ma ho solo avere a lamentarsi: il nuovo LoggingFilterè davvero fastidioso perché ti costringe a usare Java Util Logging. Sarebbe meglio se mi desse il controllo sul logger. Sembra un passo indietro nel design.


3
So che questa è una vecchia risposta, ma ho una domanda: sai come fare in modo che il logger stampi TUTTE le informazioni contenute in una richiesta? In particolare, i cookie. Ho usato il LoggingFilter(Logger logger, boolean PrintEntity)costruttore, ma anche quello non stampa i cookie.
bkaiser

2
LoggingFilter è ora deprecato. Dovresti usare la risposta di Martin della funzione LoggingFeature. Questo supporta anche l'enumerazione Verbosity per stampare una quantità variabile di dettagli. Dovrebbe stampare le intestazioni, che dovrebbero includere i cookie.
Dan Hardiker

Per qualche motivo LoggingFeaturenon stampa nulla e LoggingFilterstampa ... 🤷‍♂️
Ferran Maylinch

0

Tutte queste risposte sono abbastanza vicine ma mancano dell'impostazione per registrare la richiesta e il corpo della risposta. Almeno con Jersey 2.30.1 questo è il modo in cui eseguo la registrazione della richiesta e della risposta, inclusi i rispettivi corpi:

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();

Tecnicamente i valori Level.Alle 8192potrebbero essere null. Li fornisco qui solo per essere concisi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.