Spring Boot:如何不使用block()通过WebClient实现依赖API调用
解决方案
首先修正你代码里的几个语法和逻辑问题:
- 方法定义缺少括号(
getToken()、getData()) getToken()的bodyToMono应指定为GetToken.class而非Object.class,才能正确映射返回结果getData()的返回类型应为Mono<Object2>而非Mono<GetToken>,与实际返回的响应类型匹配
接下来,利用Reactor响应式框架中的flatMap操作符,就能实现无阻塞的链式调用——它会在第一个异步请求(获取Token)完成后,自动将结果传入第二个请求:
// 修正后的获取Token方法 public Mono<GetToken> getToken() { return webClient .get() .uri(uriBuilder -> uriBuilder.path("api/getToken").build()) .retrieve() .bodyToMono(GetToken.class); } // 接收Token参数的数据查询方法 public Mono<Object2> getData(String tokenID) { return webClient .get() .uri(uriBuilder -> uriBuilder.path("api/getData/" + tokenID).build()) .retrieve() .bodyToMono(Object2.class); } // 整合两次请求的链式逻辑 public Mono<Object2> fetchDataWithToken() { return getToken() .flatMap(token -> getData(token.getTokenID())); }
核心逻辑说明:
flatMap是响应式编程中处理异步依赖的核心操作符,它会订阅第一个Mono(获取Token的请求),当该请求成功返回结果后,自动将Token传入getData方法发起第二个请求,最终返回封装了数据查询结果的Mono<Object2>- 整个流程全程异步非阻塞,完全遵循Reactor的响应式编程模型,不需要通过
block()阻塞线程来同步获取结果
内容的提问来源于stack exchange,提问作者Felipe Ferro
相关产品推荐
相关产品推荐

