如何在 JAX-RS 客户端中记录请求正文

Posted

技术标签:

【中文标题】如何在 JAX-RS 客户端中记录请求正文【英文标题】:How to log request body in JAX-RS client 【发布时间】:2015-07-23 03:05:29 【问题描述】:

我需要查看带有客户端 JAX-RS 请求的请求正文,以验证序列化是否正确,并将请求重用于测试客户端,例如 Postman。

我知道可以使用 Jersey 来激活日志记录,例如使用 resource.addFilter(new com.sun.jersey.api.client.filter.LoggingFilter());。但是,我不直接使用 Jersey 或 RESTEasy 实现,而是通过 JAX-RS API 进行抽象:

final WebTarget target = 
        ClientBuilder.newBuilder().build().target("http://localhost:8080");

如何在此处启用日志记录?


结果

The answer from @peeskillet + this snippet.

但是,有时来自 sn-p 的 close() 方法不会被 JAX-RS 实现调用(在本例中为 org.jboss.resteasy:resteasy-client-3.0.11.FINAL)。

【问题讨论】:

你可以根据LoggingFilter源代码自行开发一个吗? 那么我在哪里或如何注册呢? @WebFilter<filter> 【参考方案1】:

JAX-RS 2.0(看起来您正在使用),具有ClientRequestFilter。您可以使用Client 甚至WebTarget 注册它。通过filter 方法,您可以获取实体并进行日志记录

public class LoggingFilter implements ClientRequestFilter 
    private static final Logger LOG = Logger.getLogger(LoggingFilter.class.getName());

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException 
        LOG.log(Level.INFO, requestContext.getEntity().toString());
    


[...]

Client client = ClientBuilder.newClient();
client.register(new LoggingFilter());

还有ClientRequestContext API ,您可能会觉得有趣。

更新

另请参阅:

JAX-RS 2 print JSON request,以获得完整/更好的实施。

【讨论】:

这基本上可以工作,但是方法requestContext.getEntity() 在序列化发生之前将实体作为对象返回。有没有办法获取将要发送的纯文本正文? 背景是我尝试同时使用库jackson-datatype-joda 和自定义Jackson-MixIn。我想看看序列化的输出来证明 JAX-RS 调用的序列化是正确的。 您可能需要自己在过滤器中编组对象。只有我能想到的简单方法。不过,工作量会增加一倍。可能还有其他方法,但这并不是我真正探索过的东西。 我找到了this solution,虽然看起来不太优雅,但基本可以使用 该网站不再可用...您能分享您的发现吗?

以上是关于如何在 JAX-RS 客户端中记录请求正文的主要内容,如果未能解决你的问题,请参考以下文章

如何正确中断 JAX-RS AJAX 请求

JAX-RS 2 打印 JSON 请求

如何使用 spring webflux 读取请求正文

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

如何在 spring-boot Web 客户端中发送请求正文?

使用 JAX-RS/RESTEasy 实现 CORS 的 Ajax 请求