Como posso ver a solicitação real que Jersey gera e envia ao servidor? Estou tendo problemas com uma solicitação específica e o colega que está executando o servidor da Web pediu para ver a solicitação completa (com cabeçalhos e outros semelhantes).
Como posso ver a solicitação real que Jersey gera e envia ao servidor? Estou tendo problemas com uma solicitação específica e o colega que está executando o servidor da Web pediu para ver a solicitação completa (com cabeçalhos e outros semelhantes).
Respostas:
Se você estiver usando apenas a API Jersey Client, o LoggingFilter (filtro do cliente) deve ajudá-lo:
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);
Caso contrário, você pode registrar novamente a solicitação e a resposta no servidor usando outro LoggingFilter (filtro de contêiner).
addFilter
método não existe em Jersey 2.x. Como você usa isso agora?
Desde a Jersey 2.23 , há um que LoggingFeature
você pode usar. O exemplo a seguir é um pouco simplificado. Observe que você também pode registrar o recurso 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
diz que a requisição "e / ou" a resposta é registrada rs. Na minha máquina, ambos estão logados.
A resposta de @ ivan.cikic é para Jersey 1.x. Veja como fazer em 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());
Isso é irrelevante, mas eu só tenho que reclamar: o novo LoggingFilter
é realmente irritante porque força você a usar o Java Util Logging. Seria melhor se isso me desse controle sobre o logger. Parece um retrocesso no design.
LoggingFilter(Logger logger, boolean PrintEntity)
construtor, mas mesmo ele não imprime cookies.
LoggingFeature
não imprime nada e LoggingFilter
imprime ... 🤷♂️
Todas essas respostas são bem parecidas, mas não possuem a configuração para registrar o corpo da solicitação e da resposta. Pelo menos com o Jersey 2.30.1 é assim que eu registro a solicitação e a resposta, incluindo seus respectivos corpos:
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, os valores Level.All
e 8192
podem ser null
. Eu apenas os forneço aqui para ser conciso.