Jersey: Imprima o pedido real

88

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

Fortuito
fonte
3
para registro no lado do servidor, consulte a seguinte postagem: [Como obter logs de camisa no servidor?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Respostas:

100

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

ivan.cikic
fonte
5
Este addFiltermétodo não existe em Jersey 2.x. Como você usa isso agora?
Daniel Kaplan
2
O JAX-RS 2.x fornece funcionalidade equivalente à API do cliente proprietário Jersey 1.x. Mais detalhes: jersey.java.net/documentation/latest/…
ivan.cikic
Para pessoas interessadas em personalizar a saída do registro, eles podem criar seu próprio LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Desde a Jersey 2.23 , há um que LoggingFeaturevocê 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.

Martin Andersson
fonte
Isso funciona muito bem para Jersey 2.25, mas no 2.7 que estou usando, o pacote de "registro" não está mais localizado em org.glassfish.jersey.core: jersey-common. Você sabe para qual pacote ele foi movido no 2.7?
Tim
Isso não imprime o corpo da solicitação ou resposta. Mostra apenas os cabeçalhos
David Brossard
2
@DavidBrossard Use org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY como um parâmetro do construtor para controlar isso.
AxelW
51

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.

Daniel Kaplan
fonte
3
Sei que esta é uma resposta antiga, mas tenho uma pergunta - você sabe como fazer com que o logger imprima TODAS as informações contidas em uma solicitação? Em particular, cookies. Usei o LoggingFilter(Logger logger, boolean PrintEntity)construtor, mas mesmo ele não imprime cookies.
bkaiser
2
LoggingFilter agora está obsoleto. Você deve usar a resposta de Martin do LoggingFeature. Isso também suporta o enum Verbosity para imprimir uma quantidade variável de detalhes. Deve imprimir cabeçalhos, que devem incluir cookies.
Dan Hardiker
Por algum motivo LoggingFeaturenão imprime nada e LoggingFilterimprime ... 🤷‍♂️
Ferran Maylinch
0

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.Alle 8192podem ser null. Eu apenas os forneço aqui para ser conciso.

james.lorenzen
fonte