我正在尝试使用 Spring 5 WebClient 记录请求。你知道我怎么能做到这一点吗?
(我正在使用 Spring 5 和 Spring boot 2)
代码现在看起来像这样:
try {
return webClient.get().uri(url, urlParams).exchange().flatMap(response -> response.bodyToMono(Test.class))
.map(test -> xxx.set(test));
} catch (RestClientException e) {
log.error("Cannot get counter from opus", e);
throw e;
}
原文由 Seb 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 ExchangeFilterFunction 轻松完成
只需在创建
WebClient
使用WebClient.Builder
时添加自定义logRequest
过滤器。这是此类过滤器的示例以及如何将其添加到
WebClient
。然后只需调用
myClient.send("get");
并且日志消息应该在那里。输出示例:
编辑
有人在评论中指出
block()
是不好的做法等。我想澄清一下:block()
此处调用仅 _用于演示目的_。无论如何,请求日志记录过滤器都会起作用。您无需将block()
添加到代码中即可使ExchangeFilterFunction
工作。您可以使用WebClient
以通常的方式执行 http 调用,链接方法并返回Mono
直到有人订阅它。答案唯一相关的部分是logRequest()
过滤器。您可以完全忽略send()
方法 - 它不是解决方案的一部分 - 它只是证明过滤器有效。有些人还询问如何记录响应。要记录响应,您可以编写另一个
ExchangeFilterFunction
并将其添加到WebClient
。为此,您可以使用ExchangeFilterFunction.ofResponseProcessor
助手,就像使用ExchangeFilterFunction.ofRequestProcessor
一样。您可以使用ClientResponse
的方法来获取标头/cookie 等。不要忘记将它添加到您的
WebClient
:但要小心,不要尝试在过滤器中读取响应主体。由于它的流性质,在没有某种缓冲包装器的情况下,主体只能被消耗一次。因此,如果您将在过滤器中阅读它,您将无法在订阅者中阅读它。
如果你真的需要记录正文,你可以让底层(Netty)来做这件事。请参阅 Matthew Buckett 的回答 以了解这个想法。