Jersey: imprimer la demande réelle

88

Comment puis-je voir la demande réelle que Jersey génère et envoie au serveur? J'ai des problèmes avec une demande particulière et le membre exécutant le serveur Web a demandé à voir la demande complète (avec les en-têtes et autres).

Au hasard
la source
3
pour la journalisation côté serveur, voir le post suivant: [Comment obtenir les journaux de Jersey sur le serveur?] [1] [1]: stackoverflow.com/questions/2332515
...

Réponses:

100

Si vous utilisez simplement l'API client Jersey, LoggingFilter (filtre client) devrait vous aider:

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

Sinon, vous pouvez à nouveau consigner la demande et la réponse sur le serveur à l'aide d'un autre LoggingFilter (filtre de conteneur).

ivan.cikic
la source
5
Cette addFilterméthode n'existe pas dans Jersey 2.x. Comment l'utilisez-vous maintenant?
Daniel Kaplan
2
JAX-RS 2.x fournit des fonctionnalités équivalentes à l'API client propriétaire Jersey 1.x. Plus de détails: jersey.java.net/documentation/latest/…
ivan.cikic
Pour les personnes intéressées par la personnalisation de la sortie du journal, elles peuvent créer leur propre LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d
55

Depuis Jersey 2.23 , LoggingFeaturevous pouvez utiliser un fichier. Ce qui suit est un exemple un peu simplifié, veuillez noter que vous pouvez également enregistrer la fonctionnalité 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 LoggingFeaturedit que la demande "et / ou" la réponse est enregistrée lol. Sur ma machine, les deux sont enregistrés.

Martin Andersson
la source
Cela fonctionne très bien pour Jersey 2.25 mais dans la version 2.7 que j'utilise, le package "logging" n'est plus situé dans org.glassfish.jersey.core: jersey-common. Savez-vous dans quel package il a été déplacé dans la version 2.7?
Tim
Cela n'imprime pas le corps de la demande ou de la réponse. Il ne montre que les en
David Brossard
2
@DavidBrossard Utilisez org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY comme paramètre de constructeur pour contrôler cela.
AxelW
51

La réponse de @ ivan.cikic est pour Jersey 1.x. Voici comment procéder dans 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());

Ce n'est pas pertinent mais je dois juste me plaindre: le nouveau LoggingFilterest vraiment ennuyeux car il vous oblige à utiliser Java Util Logging. Ce serait mieux si cela me donnait le contrôle de l'enregistreur. Cela ressemble à un pas en arrière dans la conception.

Daniel Kaplan
la source
3
Je sais que c'est une vieille réponse, mais j'ai une question - savez-vous comment faire en sorte que l'enregistreur imprime TOUTES les informations contenues dans une demande? En particulier, les cookies. J'ai utilisé le LoggingFilter(Logger logger, boolean PrintEntity)constructeur, mais même cela n'imprime pas les cookies.
bkaiser
2
LoggingFilter est désormais obsolète. Vous devriez utiliser la réponse de Martin à propos de LoggingFeature. Cela prend également en charge l'énumération Verbosity pour imprimer une quantité variable de détails. Il doit imprimer des en-têtes, qui doivent inclure des cookies.
Dan Hardiker
Pour une raison quelconque, LoggingFeaturen'imprime rien et LoggingFilterimprime ... 🤷‍♂️
Ferran Maylinch
0

Toutes ces réponses sont assez proches, mais elles n'ont pas le paramètre pour enregistrer le corps de la demande et de la réponse. Au moins avec Jersey 2.30.1, c'est ainsi que j'accomplis la journalisation de la demande et de la réponse, y compris leurs corps respectifs:

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

Techniquement, les valeurs Level.Allet 8192pourraient être null. Je les fournis ici pour être concis.

james.lorenzen
la source