Jersey: imprima la solicitud real

88

¿Cómo puedo ver la solicitud real que Jersey genera y envía al servidor? Tengo problemas con una solicitud en particular y el compañero que ejecuta el servidor web pidió ver la solicitud completa (con encabezados y demás).

Al azar
fuente
3
para iniciar sesión en el lado del servidor, consulte la siguiente publicación: [¿Cómo obtener registros de Jersey en el servidor?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Respuestas:

100

Si solo está usando Jersey Client API, LoggingFilter (filtro de cliente) debería ayudarlo:

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

De lo contrario, puede volver a registrar tanto la solicitud como la respuesta en el servidor utilizando otro LoggingFilter (filtro de contenedor).

ivan.cikic
fuente
5
Este addFiltermétodo no existe en Jersey 2.x. ¿Cómo usas esto ahora?
Daniel Kaplan
2
JAX-RS 2.x proporciona una funcionalidad equivalente a la API de cliente propietaria de Jersey 1.x. Más detalles: jersey.java.net/documentation/latest/…
ivan.cikic
Para las personas interesadas en personalizar la salida del registro, pueden crear su propio LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Desde Jersey 2.23 , hay una LoggingFeatureque podrías usar. El siguiente es un ejemplo un poco simplificado, tenga en cuenta que también puede registrar la función 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 de LoggingFeaturedice que la solicitud "y / o" la respuesta se registra lol. En mi máquina, ambos están registrados.

Martin Andersson
fuente
Esto funciona muy bien para Jersey 2.25 pero en 2.7 que estoy usando, el paquete "logging" ya no se encuentra dentro de org.glassfish.jersey.core: jersey-common. ¿Sabes a qué paquete se trasladó en 2.7?
Tim
Esto no imprime el cuerpo de la solicitud o respuesta. Solo muestra los encabezados
David Brossard
2
@DavidBrossard Usa org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY como parámetro de constructor para controlar esto.
AxelW
51

La respuesta de @ ivan.cikic es para Jersey 1.x. Así es como se hace en 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());

Esto es irrelevante, pero solo tengo que quejarme: lo nuevo LoggingFilteres realmente molesto porque te obliga a usar Java Util Logging. Sería mejor si me diera control sobre el registrador. Parece un paso atrás en el diseño.

Daniel Kaplan
fuente
3
Sé que esta es una respuesta antigua, pero tengo una pregunta: ¿sabe cómo hacer que el registrador imprima TODA la información contenida en una solicitud? En particular, cookies. He usado el LoggingFilter(Logger logger, boolean PrintEntity)constructor, pero incluso eso no imprime cookies.
bkaiser
2
LoggingFilter ahora está en desuso. Debe usar la respuesta de Martin de LoggingFeature. Esto también admite la enumeración Verbosity para imprimir una cantidad variable de detalles. Debería imprimir encabezados, que deberían incluir cookies.
Dan Hardiker
Por alguna razón LoggingFeatureno imprime nada y LoggingFiltersí imprime ... 🤷‍♂️
Ferran Maylinch
0

Todas estas respuestas están bastante cerca pero carecen de la configuración para registrar el cuerpo de la solicitud y la respuesta. Al menos con Jersey 2.30.1, así es como logro registrar la solicitud y la respuesta, incluidos sus respectivos cuerpos:

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

Técnicamente, los valores Level.Ally 8192podrían serlo null. Solo los proporciono aquí para ser concisos.

james.lorenzen
fuente