我正在尝试使用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; }
您可以使用ExchangeFilterFunction轻松完成此操作
在logRequest创建WebClientusing 时,只需添加自定义过滤器WebClient.Builder。
logRequest
WebClient
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");和登录消息就在那里。
myClient.send("get");
输出示例:
Request: GET https://httpbin.org/get?param=value header1=value1 header2=value2