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).
88
Réponses:
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).
la source
addFilter
méthode n'existe pas dans Jersey 2.x. Comment l'utilisez-vous maintenant?Depuis Jersey 2.23 ,
LoggingFeature
vous 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
LoggingFeature
dit que la demande "et / ou" la réponse est enregistrée lol. Sur ma machine, les deux sont enregistrés.la source
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
LoggingFilter
est 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.la source
LoggingFilter(Logger logger, boolean PrintEntity)
constructeur, mais même cela n'imprime pas les cookies.LoggingFeature
n'imprime rien etLoggingFilter
imprime ... 🤷♂️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.All
et8192
pourraient êtrenull
. Je les fournis ici pour être concis.la source