一尘不染

如何记录Spring 5 WebClient调用

spring-boot

我正在尝试使用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;
}

阅读 282

收藏
2020-05-30

共1个答案

一尘不染

您可以使用ExchangeFilterFunction轻松完成此操作

logRequest创建WebClientusing 时,只需添加自定义过滤器WebClient.Builder

这是此类过滤器的示例,以及如何将其添加到中WebClient

@Slf4j
@Component
public class MyClient {

    private final WebClient webClient;

    // Create WebClient instance using builder.
    // If you use spring-boot 2.0, the builder will be autoconfigured for you
    // with the "prototype" scope, meaning each injection point will receive
    // a newly cloned instance of the builder.
    public MyClient(WebClient.Builder webClientBuilder) {
        webClient = webClientBuilder // you can also just use WebClient.builder()
                .baseUrl("https://httpbin.org")
                .filter(logRequest()) // here is the magic
                .build();
    }

    // Just example of sending request
    public void send(String path) {
        ClientResponse clientResponse = webClient
                .get().uri(uriBuilder -> uriBuilder.path(path)
                        .queryParam("param", "value")
                        .build())
                .exchange()
                .block();
        log.info("Response: {}", clientResponse.toEntity(String.class).block());
    }

    // This method returns filter function which will log request data
    private static ExchangeFilterFunction logRequest() {
        return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
            log.info("Request: {} {}", clientRequest.method(), clientRequest.url());
            clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value)));
            return Mono.just(clientRequest);
        });
    }

}

然后,只需致电myClient.send("get");和登录消息就在那里。

输出示例:

Request: GET https://httpbin.org/get?param=value
header1=value1
header2=value2
2020-05-30