如何在 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 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?