java - 如何在 spring webflux/webclient 中有条件地链接 webclient 调用

标签 java spring spring-webflux

我正在尝试使用 WebClient 实现以下场景。使用 RestTemplate 很简单,但我不能再这样做了。

伪java代码中Spring Controller 的相关部分:

Mono<T1> t1 = webClient.get()...retrieve()...;
Mono<T2> t2;

if (t1.getResult().getValue() > 0) {
    t2 = webClient.get().buildUsing(t1.getResult().getValue())...retrieve()...);
} else {
    t2 = Mono.empty();
}

return(Mono.zip(t1, t2, mergeFunction));

我不是在问如何使用 Webflux。我还可以自己添加错误处理。我的问题是,如果第一个调用成功,如何将数据传递给第二个调用,以及在哪里合并两个调用的结果,其中一个调用可能会发生也可能不会发生。如果我可以使用 RestTemplate,这个任务绝对是微不足道的。

有一个标题非常相似的问题,但没有得到解答。

最佳答案

我认为zipWhen非常适合这个目的。 zipWhen等待第一个单声道的结果,然后将两个结果组合成 Tuple2

WebClient.builder().baseUrl("https://jsonplaceholder.typicode.com/todos/1")
    .build()
    .get()
    .retrieve()
    .bodyToMono(User.class)
    .zipWhen(r -> {
      if (r.getId() == 1) {
        return  WebClient.builder().baseUrl("https://jsonplaceholder.typicode.com/todos/2")
            .build()
            .get()
            .retrieve()
            .bodyToMono(User.class);
      } else {
        return Mono.empty();
      }
    });

结果是 Mono<Tuple2<T, T2>>保持这两个值。

关于java - 如何在 spring webflux/webclient 中有条件地链接 webclient 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525800/

相关文章:

spring-webflux - Webflux 响应式(Reactive) API 的 Spring Cloud Contract

java - 服务器发送的事件在传入 React 时会成倍增加

java - 如何等待所有一次性元素完成?

java - 无法运行 selenium 独立服务器

java - iTextPDF 7 在绝对位置添加文本

java - Spring 4 - 资源映射 - 未找到处理程序方法

java - 如何在 Spring Boot 中使用显式指定的编码器

java - 分布式处理的最大吞吐量(使用netty 4.0)

java - 无法保存使用应用程序拍摄的图像?

java - Spring MVC + Thymeleaf - 保存关系@ManyToOne