如何在单声道<T>的订阅方法中进行 REST API 调用



我有一个带有Spring WebFlux的Spring启动应用程序。我想以非阻塞方式调用 API Rest,然后,在订阅方法中调用另一个 API Rest。

第一个调用执行正确,订阅方法也是如此。我的问题是在订阅中,如何请求另一个 API Rest?

@Autowired
WebClient.Builder webClientBuilder;
Mono<UserRating> monoUserRating = webClientBuilder.build().get().uri("http://ratings-data-service:8083/ratingsdata/user/" + userId)             .retrieve().bodyToMono(UserRating.class);
monoUserRating.subscribe(CatalogResource::handleResponseUserRating);
private static List<CatalogItem> handleResponseUserRating(UserRating userRating) {
    System.out.println("How to call another API???");
    //this doesn't work since is not static
    Movie movie = webClientBuilder.build().get().uri("http://movie-info-service:8082/movies/"+ rating.getMovieId())
                        .retrieve().bodyToMono(Movie.class).block();
}

使用 Mono.flatMap 将两个异步操作绑定在一起,链接到 doc。

@Autowired
WebClient.Builder webClientBuilder;
public void main() {
  Mono<Movie> movieMono = getUserRating(userId)
    .flatMap(userRating -> handlerUserRating(userRating));
  movieMono.subscribe(movie -> handleMovie(movie));
}
private Mono<UserRating> getUserRating(String userId) {
  return webClientBuilder.build()
    .get()
    .uri("http://ratings-data-service:8083/ratingsdata/user/" + userId)
    .retrieve()
    .bodyToMono(UserRating.class);
}
private Mono<Movie> handleUserRating(UserRating rating) {
  return webClientBuilder.build()
    .get()
    .uri("http://movie-info-service:8082/movies/"+ rating.getMovieId())
    .retrieve()
    .bodyToMono(Movie.class);
}

最新更新