【发布时间】:2019-11-28 05:20:26
【问题描述】:
我已经开始使用 WebClient,我正在添加请求/响应的日志记录,并且我在构建 WebClient 时使用了过滤器方法:
WebClient.builder()
.baseUrl(properties.getEndpoint())
.filter((request, next) -> {
// logging
request.body()
})
.build();
我能够访问 url、http 方法、标头,但我在获取原始请求正文时遇到问题,因为 body() 请求方法返回 BodyInserter (BodyInserter<?, ? super ClientHttpRequest> body()。
如何将BodyInserter 转换为String 请求正文的表示?或者,如何正确记录整个请求/响应,同时还能在其中散列潜在凭据?
【问题讨论】:
-
据我所知这是不可能的,因为 webflux 是一个 netty 客户端的包装器,而 body 插入器只是一个传递的 lambda 函数,在发出实际请求时要执行。
-
那么有什么明智的选择吗?必须有一种相对简单的请求/响应日志记录方式,并且可以进行定制
-
为什么必须有?我从来没有觉得有必要在请求中记录正文。这是您基于意见的意见,即“必须有一些东西可以轻松记录身体”。为什么要记录身体。陈述你的情况。
-
我必须为每个方法添加日志记录或在 WebClient 周围实现包装器,这对我来说听起来不是一个好的解决方案。我想要一个集中的地方来记录 http 请求/响应,我可以在网络内的多个应用程序之间共享它
-
@ThomasAndolf 这是您基于意见的意见,没有人应该想以简单的方式记录正文,因为您个人从未觉得需要在请求中记录正文。 :) 恕我直言,它实际上确实很有意义,如果您想审核/调试,实际通过线路发送的内容和标准日志记录并没有削减它,因为您必须屏蔽凭据(例如,因为 PCI 合规性)
标签: java spring spring-webflux