Jersey: 打印实际请求

如何查看 Jersey 生成并发送到服务器的实际请求?我有一个特定的请求和伙伴运行的网络服务器要求看到完整的请求(与头等)的问题。

90124 次浏览

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

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

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.

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.