Jersey: Print the actual request
Asked Answered
R

5

101

How can I view the actual request that Jersey generates and sends to the server? I am having issues with a particular request and the fellow running the webserver asked to see the full request (with headers and the such).

Reality answered 28/7, 2011 at 14:29 Comment(1)
for logging at the server side see the following post: [How to get jersey logs at server?][1] [1]: #2333015Superman
U
105

If you're just using Jersey Client API, LoggingFilter (client filter) should help you:

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

Otherwise, you can again log both request and response on server using other LoggingFilter (container filter).

Urea answered 29/7, 2011 at 13:30 Comment(3)
This addFilter method doesn't exist in Jersey 2.x. How do you use this now?Promisee
JAX-RS 2.x provides functionality that is equivalent to the Jersey 1.x proprietary client API. More details: jersey.java.net/documentation/latest/…Urea
For people interested in customizing the log output, they can create their own LoggingFilter #30188014Bracket
P
67

Since Jersey 2.23, there's a LoggingFeature you could use. The following is a bit simplified example, please note that you can register the feature on WebTarget as well.

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 of LoggingFeature says that the request "and/or" the response is logged lol. On my machine, both are logged.

Prudhoe answered 3/6, 2016 at 21:19 Comment(3)
This works great for Jersey 2.25 but in 2.7 which I am using, the "logging" package is no longer located within org.glassfish.jersey.core:jersey-common. Do you know which package it was moved to in 2.7?Reentry
This does not print the body of the request or response. It only shows the headersGiblets
@DavidBrossard Use org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY as a constructor parameter to control this.Abm
P
54

@ivan.cikic's answer is for Jersey 1.x. Here's how you do it in 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());

This is irrelevant but I just have to complain: The new LoggingFilter is really annoying because it forces you to use Java Util Logging. It would be better if it gave me control over the logger. Seems like a step backwards in design.

Promisee answered 7/1, 2015 at 21:42 Comment(3)
I know this is an old answer, but I have a question - do you know how to get the logger to print ALL of the information contained in a request? In particular, cookies. I've used the LoggingFilter(Logger logger, boolean PrintEntity) constructor, but even that doesn't print cookies.Sides
LoggingFilter is now deprecated. You should use Martin's answer of the LoggingFeature. This also supports the Verbosity enum to print out a varying amount of detail. It should print out headers, which should include cookies.Continence
For some reason LoggingFeature doesn't print anything and LoggingFilter does print... 🤷‍♂️Ahriman
C
4

All these answers are pretty close but they lack the setting to log the request and response body. At least with Jersey 2.30.1 this is how I accomplish logging the request and response including their respective bodies:

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

Technically the Level.All and 8192 values could be null. I just provide them here to be concise.

Clisthenes answered 1/7, 2020 at 16:20 Comment(0)
E
0

For version 3.1.X it must be:

Logger logger = Logger.getLogger("test");
LoggingFeature loggingFeature = new LoggingFeature(logger, Level.INFO, Verbosity.PAYLOAD_ANY,null);
Client client = ClientBuilder.newClient();
client.register(loggingFeature);

Level.ALL is NOT Working

Expiate answered 2/3, 2023 at 14:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.