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);
如何重新使用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);