Spring反应式阅读web客户端响应

Spring反应式阅读web客户端响应,spring,spring-webflux,reactive,spring-webclient,Spring,Spring Webflux,Reactive,Spring Webclient,我正在学习SpringReactive,并拥有以下基本的Reactive演示代码 import org.springframework.web.reactive.function.client.WebClient; // other imports etc @Slf4j class WebClientTests { private static String baseUrl = "http://localhost:8080"; private static WebC

我正在学习SpringReactive,并拥有以下基本的Reactive演示代码

import org.springframework.web.reactive.function.client.WebClient;
// other imports etc

@Slf4j
class WebClientTests {
  private static String baseUrl = "http://localhost:8080";
  private static WebClient client = WebClient.create(baseUrl);
  @Test
  void testWebClient() {
    Instant start = Instant.now();
    Flux.just(1,2,3)
      .map(i -> client.get().uri("/person/{id}", i).retrieve().bodyToFlux(Person.class))
      .subscribe(s -> {
        log.info("subscribed: {}", s);
      });
    log.info("Elapsed time: " + Duration.between(start, Instant.now()).toMillis() + "ms");
  }
}
它输出以下内容

20:32:55.251 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.668 [main] INFO com.example.reactive.reactivedemo.WebClientTests - Elapsed time: 84ms

但是我不确定为什么它不输出get请求的值?它实际上并没有触发端点。

您几乎肯定希望在
.map(i->client.get().uri…
行中使用
flatMap()
,而不是
map()

map()
用于同步转换,在同步转换中,您返回要映射到的实际值。您没有返回实际值-您是从映射方法返回发布者,因此发布者只是按原样返回-它永远不会被订阅,因为在订阅之前不会发生任何事情,所以您的web请求永远不会执行


flatMap()
用于非阻塞转换,其中您返回一个发布者,该发布者发出一个或多个要映射到的值。该发布者作为您的反应链的一部分订阅,该发布者发出的值沿着该链传递给下一个操作员。

我猜是因为您没有对结果执行任何操作也许它被优化了。谢谢你的回答。我想你在这里发现了一些东西,但是它仍然没有触发请求?@Robbo_UK测试可能在你触发请求之前完成,因为你正在订阅但没有等待请求完成。如果你真的想这样运行测试,那么你应该使用
blockLast()
而不是
subscribe()