球衣:打印实际请求


88

我如何查看Jersey生成并发送到服务器的实际请求?我在处理特定请求时遇到问题,正在运行网络服务器的同伴要求查看完整的请求(带有标头等)。


3
在服务器端日志请参见下面的文章:[如何在服务器获取球衣日志?] [1] [1]:stackoverflow.com/questions/2332515/...
eeezyy

Answers:


100

如果您仅使用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(容器过滤器)再次在服务器上记录请求和响应。


5
addFilter方法在Jersey 2.x中不存在。您现在如何使用它?
Daniel Kaplan 2015年

2
JAX-RS 2.x提供的功能等同于Jersey 1.x专有客户端API。更多详细信息: jersey.java.net/documentation/latest/…– ivan.cikic
2015年

感兴趣的自定义日志输出的人,他们可以创建自己的LoggingFilter的stackoverflow.com/questions/30187514/...
nacho4d

55

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表示请求“和/或”响应被记录为大声笑。在我的计算机上,两者均已记录。


这对于Jersey 2.25非常有效,但是在我使用的2.7中,“ logging”包不再位于org.glassfish.jersey.core:jersey-common中。您知道在2.7中将其移动到哪个软件包吗?
蒂姆(Tim)

这不会打印请求或响应的主体。它只是显示了标题
大卫·布罗萨德

2
@DavidBrossard使用org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY作为构造函数参数来控制它。
AxelW

51

@ 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。如果它可以让我控制记录器,那就更好了。似乎在设计上倒退了一步。


3
我知道这是一个旧答案,但是我有一个问题-您知道如何让记录器打印请求中包含的所有信息吗?特别是cookie。我使用了LoggingFilter(Logger logger, boolean PrintEntity)构造函数,但是即使那样也不会打印cookie。
bkaiser 2015年

2
LoggingFilter现在已弃用。您应该使用Martin的LoggingFeature答案。这也支持Verbosity枚举打印出不同数量的细节。它应该打印出标题,其中应包含cookie。
Dan Hardiker

出于某种原因,LoggingFeature它什么也不打印,LoggingFilter而是打印... 🤷‍♂️
Ferran Maylinch

0

所有这些答案都非常接近,但是它们缺少记录请求和响应正文的设置。至少对于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.All8192值可以是null。我只是为了简明扼要地在此提供它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.