Как я могу условно связать вызовы веб-клиентов весной? Webflux / webclient - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь добиться следующего сценария с помощью WebClient. Использовать RestTemplate тривиально, но я больше не могу.

Соответствующие части контроллера Spring в псевдо-Java-коде:

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.

Есть вопрос с очень похожим названием, но он не получил ответа.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Я думаю 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>>, содержащий оба значения.

0 голосов
/ 23 октября 2019

насколько я мог понять вашу проблему, это мое реактивное решение:

 private static Mono<String> mono() {
    Mono<Integer> t1 = Mono.just(0);

    return t1.flatMap(outerResult -> outerResult > 0
        ? Mono.just("VALUE").map(innerResult -> outerResult + "" + innerResult)
        : Mono.just(outerResult.toString())
    );
}

Итак, что здесь происходит:

С .flatMap вы подписываетесь на новую Mono и возьми результат. Внутри лямбды .flatMap у вас все еще есть результат вашего t1, поэтому вы можете использовать .map на t2, если вам нужно подписаться, или просто делать все, что вам нужно сделать с результатом t1 чтобы привести его к искомому возвращаемому значению.

...