首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring reactive reading web客户端响应

Spring reactive reading web客户端响应
EN

Stack Overflow用户
提问于 2021-06-07 03:39:51
回答 1查看 59关注 0票数 1

我正在学习Spring Reactive,并有以下基本的reactive演示代码。

代码语言:javascript
复制
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");
  }
}

它输出以下内容。

代码语言:javascript
复制
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请求的值?它实际上并没有触发端点。

EN

回答 1

Stack Overflow用户

发布于 2021-06-07 04:08:04

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

map()用于同步转换,您将返回要映射到的实际值。你不会返回一个实际的值--你会从你的map方法中返回一个发布者,所以这个发布者只是按原样返回的--它永远不会被订阅,而且因为在你订阅之前什么都不会发生,所以你的web请求永远不会执行。

flatMap()用于非阻塞转换,在这种转换中,您返回一个发布者,该发布者发出您希望映射到的一个或多个值。该发布者被订阅为您的反应链的一部分,并且由该发布者发出的值沿着链向下传递给下一个操作员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67863048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档