¿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).
¿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).
Respuestas:
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).
addFilter
método no existe en Jersey 2.x. ¿Cómo usas esto ahora?
Desde Jersey 2.23 , hay una LoggingFeature
que 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 LoggingFeature
dice que la solicitud "y / o" la respuesta se registra lol. En mi máquina, ambos están registrados.
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 LoggingFilter
es 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.
LoggingFilter(Logger logger, boolean PrintEntity)
constructor, pero incluso eso no imprime cookies.
LoggingFeature
no imprime nada y LoggingFilter
sí imprime ... 🤷♂️
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.All
y 8192
podrían serlo null
. Solo los proporciono aquí para ser concisos.