Spring webclient如何多次提取响应体

Spring webclient how to extract response body multiple times

如何重新使用webclient客户端响应?我正在使用 webclient 进行同步请求和响应。我是 webclient 的新手,不确定如何在多个地方提取响应正文

WebClient webClient = WebClient.builder().baseUrl("http://localhost:8080").build();

下面是我对 API 的调用 returns 有效响应

ClientResponse clientResponse;
clientResponse = webClient.get()
                          .uri("/api/v1/data")
                          .accept(MediaType.APPLICATION_JSON)
                          .exchange()
                          .block();

如何在多个地方使用clientResponse?只有一次我能够提取响应正文

String response = clientResponse.bodyToMono(String.class).block(); // response has value

当我第二次尝试提取响应主体时(在不同的 class 中),它是空的

String response = clientResponse.bodyToMono(String.class).block(); // response is null

那么,有人可以解释为什么第二次响应为空以及如何多次提取响应主体吗?

WebClient基于Reactor-netty,接收到的缓冲区是一次性的。

你可以做的一件事是在第一时间缓存结果然后重新使用它。

这个问题可以参考spring云网关:https://github.com/spring-cloud/spring-cloud-gateway/issues/1861

或者参考Spring云网关缓存请求的方法body:https://github.com/spring-cloud/spring-cloud-gateway/blob/master/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/AdaptCachedBodyGlobalFilter.java

或者您可以像这样编写代码:

String block = clientResponse.bodyToMono(String.class).block();
    

下次你可以使用这个 body:

Mono.just(block);