我如何查看Jersey生成并发送到服务器的实际请求?我在处理特定请求时遇到问题,正在运行网络服务器的同伴要求查看完整的请求(带有标头等)。
Answers:
如果您仅使用Jersey客户端API,则LoggingFilter(客户端过滤器)应该可以帮助您:
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);
否则,您可以使用其他LoggingFilter(容器过滤器)再次在服务器上记录请求和响应。
addFilter
方法在Jersey 2.x中不存在。您现在如何使用它?
从Jersey 2.23开始,LoggingFeature
您可以使用。以下是一个简化的示例,请注意,您也可以注册该功能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();
JavaDocLoggingFeature
表示请求“和/或”响应被记录为大声笑。在我的计算机上,两者均已记录。
@ ivan.cikic的答案是针对Jersey1.x。在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());
这无关紧要,但我只需要抱怨:新的LoggingFilter
内容确实很烦人,因为它迫使您使用Java Util Logging。如果它可以让我控制记录器,那就更好了。似乎在设计上倒退了一步。
LoggingFilter(Logger logger, boolean PrintEntity)
构造函数,但是即使那样也不会打印cookie。
LoggingFeature
它什么也不打印,LoggingFilter
而是打印... 🤷♂️
所有这些答案都非常接近,但是它们缺少记录请求和响应正文的设置。至少对于Jersey 2.30.1,这是我完成记录请求和响应(包括它们各自的正文)的方式:
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();
从技术上讲,Level.All
和8192
值可以是null
。我只是为了简明扼要地在此提供它们。