我有一个api需要调用其他3个api,第二个和第三个api调用依赖于第一个api的结果。
我对执行此操作的最佳方法以及使用块、订阅和平面地图之间的区别有点困惑。所有这 3 种方法都适合我,但我不确定哪一种是最好的。
这就是我目前所拥有的:
webClient1.getApi1(request.getId())
.subscribe(api1Response -> {
if (api1Response.hasData()) {
Mono<ApiTwoResponse> monoTwo = webClient2
.post()
.syncBody(...)
.bodyToMono(ApiTwoResponse.class)
monoTwo.subscribe(two -> log.info(two));
Mono<ApiThreeResponse> monoThree = webClient3
.put()
.syncBody(...)
.bodyToMono(ApiThreeResponse.class)
monoThree.subscribe(three -> log.info(three));
}
});
Run Code Online (Sandbox Code Playgroud)
我也尝试过阻止,尽管这似乎不鼓励:
Api1Response response = webClient1.getApi1(request.getId()).block()
Run Code Online (Sandbox Code Playgroud)
我也尝试过平面地图,尽管这迫使你返回一些东西:
webClient1.getApi1(request.getId())
.flatmap(api1Response -> {
...
return Mono.empty();
});
Run Code Online (Sandbox Code Playgroud)
感谢对上述代码的任何帮助和反馈。
block操作,本质上是停止和等待。它相当于java中的Future.get()。它违背了非阻塞代码的目的。
Flatmap将一系列序列展平为单个序列,因此 List {List{?}} 将变成 list{Object}。
subscribe本质上开始倾听,并且可以采取行动。通常在订阅之前不会发生任何事情。
但对于您的用例,您可以使用filter这里的一个示例,它看起来对 {true, false} 项进行过滤,然后对于每个为 true 的过滤器,我将两个单声道的结果压缩在一起,然后使用操作进行订阅
Flux<Boolean> bool = Flux.just(true, false);
Mono<Integer> mono1 = Mono.just(1);
Mono<String> mono2 = Mono.just("string");
bool.filter(b -> b)
.flatMap(b -> Mono.zip(mono1, mono2))
.subscribe(tuple -> System.out.println(tuple.getT1() + ", " + tuple.getT2()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14196 次 |
| 最近记录: |