Как использовать Reactor (Spring WebClient) для повторного вызова? - PullRequest
0 голосов
/ 10 сентября 2018

Я использую Reactor (Spring5 WebClient) в качестве своего API реактивного программирования. У меня есть 2 конечных точки REST для вызова. Результатом первого будет параметр для второго. Для второго API он вернет результат со значением hasMore. Если это значение равно true , я должен изменить параметры нумерации страниц и снова вызвать второй API. Демо-код следующий:

 client.getApi1()
        .map(r -> r.getResult())
        .flatMap(p -> client.getApi2(p, 2(page size), 1(page start)))
        .subscribe(r -> System.out.println(r.isHasmore()));

Как повторить вызов второго API (getApi2), пока значение hasMore не станет ложным.

Кроме того, мне нужно изменить параметры страницы и размер страницы

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я нахожу решение с помощью оператора расширения. Но нужно внести некоторые изменения в мой вызов API. В ответе от getApi2 необходимо вернуть размер последней страницы и начало последней страницы.

    client.getApi1()
        .map(r -> r.getResult())
        .getApi2(p, 2, 1)
        .expand(res -> {
            if (res.isHasmore()) {
                return client.getApi2(orgId, res.getPageSize(), res.PageStart() + 1);
            }
            return Flux.empty();
        });
0 голосов
/ 11 сентября 2018

Попробуйте этот код:

 AtomicInteger pageCounter = new AtomicInteger(0);
 client.getApi1()
    .map(r -> r.getResult())
    .flatMap(p -> client.getApi2(p, 2(page size), pageCounter.incrementAndGet()))
    .repeat()            
    .takeWhile(r -> r.isHasmore())
    .subscribe(r -> System.out.println(r.isHasmore()));

repeat() звонки getApi2 бесконечно. takeWhile(continuePredicate) передает значения, в то время как continuePredicate (r.isHasmore()) возвращает true

...