如何使用 Reactor (Spring WebClient) 重复调用?
How to use Reactor (Spring WebClient) to do a repeat call?
我正在使用 Reactor (Spring5 WebClient) 作为我的反应式编程 API。我有 2 个 REST 端点可以调用。第一个的结果将是第二个的参数。对于第二个 API,它将 return 具有 "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" 为假。
此外,我需要更改参数页面大小和页面开始
试试这个代码:
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()
) returns true
我找到了使用扩展运算符的解决方案。但是,需要对我的 API 调用进行一些更改。来自 getApi2
的响应需要 return 最后一页大小和最后一页开始。
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();
});
我正在使用 Reactor (Spring5 WebClient) 作为我的反应式编程 API。我有 2 个 REST 端点可以调用。第一个的结果将是第二个的参数。对于第二个 API,它将 return 具有 "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" 为假。
此外,我需要更改参数页面大小和页面开始
试试这个代码:
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()
) returns true
我找到了使用扩展运算符的解决方案。但是,需要对我的 API 调用进行一些更改。来自 getApi2
的响应需要 return 最后一页大小和最后一页开始。
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();
});