繁体   English   中英

Spring 响应式读取 web 客户端响应

[英]Spring reactive reading web client response

我正在学习 Spring 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

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

你几乎肯定想在你的.map(i -> client.get().uri...行上使用flatMap() ,而不是map()

map()用于同步转换,您将要返回到 map 的实际值 您没有返回实际值 - 您正在从 map 方法返回发布者,因此发布者只是按原样返回 - 它从未订阅过,并且由于在您订阅之前没有任何反应,因此您的 web 请求永远不会执行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM