Как сделать вызов REST API внутри метода подписки Mono <T> - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть загрузочное приложение Spring с Spring WebFlux. Я хочу вызвать 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();

}

1 Ответ

0 голосов
/ 09 мая 2019

Используйте Mono.flatMap для связывания двух асинхронных операций, ссылка на документ .

@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);
}
...