2011-07-28 18 views
74

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

+3

para iniciar la sesión en el lado del servidor vea el siguiente mensaje: [¿Cómo obtener los registros de jersey en el servidor?] [1] [1]: https://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server – eeezyy

Respuesta

92

Si sólo está utilizando Jersey API de cliente, LoggingFilter (filtro de cliente) debe ayudarle a:

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 conectarse tanto de solicitud y respuesta en el servidor usando otra (filtro contenedor) LoggingFilter.

+4

Este método 'addFilter' no existe en Jersey 2.x. ¿Cómo usas esto ahora? –

+2

JAX-RS 2.x proporciona una funcionalidad que es equivalente a la API cliente de Jersey 1.x. Más detalles: https://jersey.java.net/documentation/latest/user-guide.html#mig-client-api –

+0

Para las personas interesadas en personalizar el resultado del registro, pueden crear su propio LoggingFilter http: // stackoverflow. com/questions/30187514/how-to-log-request-body-in-jax-rs-client – nacho4d

46

@ La respuesta de ivan.cikic es para Jersey 1.x. Así es como lo haces 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 acabo de tener a quejarse: El nuevo LoggingFilter es realmente molesto porque te obliga a utilizar Java Util registro. Sería mejor si me daba el control sobre el registrador. Parece un paso atrás en el diseño.

+2

Sé que esta es una respuesta antigua, pero tengo una pregunta: ¿sabe cómo hacer que el registrador imprima TODO la información contenida en una solicitud? En particular, las cookies. He usado el constructor 'LoggingFilter (Logger logger, booleano PrintEntity)', pero incluso eso no imprime cookies. – bkaiser

+0

LoggingFilter ahora está en desuso. Debe usar la respuesta de Martin de LoggingFeature. Esto también es compatible con Verosity enum para imprimir una cantidad variable de detalles. Debería imprimir encabezados, que deberían incluir cookies. –

31

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

+0

Esto funciona muy bien para Jersey 2.25 pero en 2.7 que estoy usando, el paquete "logging" ya no está ubicado dentro de org.glassfish.jersey.core: jersey-common. ¿Sabes a qué paquete se movió en 2.7? – Tim

+0

Ver la respuesta de @Daniel Kaplan a continuación .. – Neo

Cuestiones relacionadas