如何使用Reactor(Spring WebClient)进行重复调用?

时间:2018-09-10 03:57:42

标签: spring spring-webflux project-reactor

我将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 :(得分:3)

尝试以下代码:

 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

答案 1 :(得分:0)

我使用扩展运算符找到了解决方案。但是,需要对我的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();
        });