java - 如何在 spring webflux/webclient 中有条件地链接 webclient 调用
问题描述
我正在尝试使用 WebClient 实现以下场景。使用 RestTemplate 很简单,但我不能再这样做了。
伪java代码中Spring控制器的相关部分:
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>>
同时持有这两个值。
推荐阅读
- awk - How to replace some particular column values in a file from the columns of other file
- sql - 如何在 SQL 的单列中显示多列?
- google-analytics - 为什么我的跟踪链接 Source/Medium 显示为 EmailCampaign/email
- c - 如何正确检查调试器?
- r - 在 emacs ess 中编辑 R 函数时的变量范围
- ubuntu - 尝试使用 minikube 运行 kubectl get pods 时无法读取客户端证书和客户端密钥
- google-chrome - Chrome 扩展:何时需要 activeTab 权限
- reactjs - 材质UI核心多选
- javascript - 使用 javascript 和 php 在段落之间动态放置图像
- vim - 改变行为
在 VIM 中将光标移动到页面顶部