Java 以反应式方式使用分页API
我试图弄清楚如何以反应式的方式使用分页API,公开项目流,而不是API提供给我的页面 我拥有的-分页API Slack API(和许多其他API)使用某种形式的元数据对象处理分页,因此在查询Java 以反应式方式使用分页API,java,pagination,reactive-programming,project-reactor,Java,Pagination,Reactive Programming,Project Reactor,我试图弄清楚如何以反应式的方式使用分页API,公开项目流,而不是API提供给我的页面 我拥有的-分页API Slack API(和许多其他API)使用某种形式的元数据对象处理分页,因此在查询/API/stuff时,您会得到如下对象: { "items": [ <list of first page you requested> ], "meta": { "cursor": "<a cursor string to get the next pag
/API/stuff
时,您会得到如下对象:
{
"items": [ <list of first page you requested> ],
"meta": {
"cursor": "<a cursor string to get the next page>"
}
}
{
“项目”:[…],
“元”:{
“光标”:”
}
}
然后,您可以使用GET/api/stuff?cursor=
请求下一个页面,在响应中,您将获得一个新的光标,因此您可以继续进行,直到您得到一个光标为空的响应-这是最后一个可用页面
我想要的-一系列的物品
对于Reactor,我想提供一种返回类型为Flux
的方法,即消费者不需要知道或关心每次实际获取一页内容的所有项目流
基本上,我想做一些事情,采用一个初始状态和一个签名为state->Mono
(或等效)的方法,通过顺序获取新页面,给我一个流量,直到状态
表明我们完成了
我曾尝试使用Flux.create
或Flux.generate
来表达一些东西,但它们的用例似乎与我的略有不同
我怎么去那里?我是一个反应堆新手,但我认为这就是为什么:
这里是一个完整的演示,其中getFirstPage()
和getNextPage()
模拟SlackAPIgetNextPage()
返回光标到达值5时的最后一页
public class Slack {
public static void main(String[] args) {
getFirstPage().expand(page -> getNextPage(page))
.flatMapIterable(page -> page.getResult())
.subscribe(System.out::println);
}
private static Mono<Page> getFirstPage() {
System.out.println("getting first page");
return Mono.just(new Page(Arrays.asList("page0-1", "page0-2"), 1));
}
private static Mono<Page> getNextPage(Page page) {
System.out.println("getting page " + page.getCursor());
if (page.getCursor() == null) {
return Mono.empty();
}
Integer nextCursor = (page.getCursor() == 5) ? null : page.getCursor() + 1;
return Mono.just(new Page(Arrays.asList("page" + page.getCursor() + "-1", "page" + page.getCursor() + "-2"), nextCursor));
}
static class Page {
private List<String> result;
private Integer cursor;
public Page(List<String> result, Integer cursor) {
this.result = result;
this.cursor = cursor;
}
public List<String> getResult() {
return result;
}
public Integer getCursor() {
return cursor;
}
}
}
公共类松弛{
公共静态void main(字符串[]args){
getFirstPage().展开(第页->getNextPage(第页))
.flatMapIterable(页面->页面.getResult())
.subscribe(System.out::println);
}
私有静态Mono getFirstPage(){
System.out.println(“获取第一页”);
返回Mono.just(新页面(Arrays.asList(“page0-1”,“page0-2”),1));
}
专用静态Mono getNextPage(第页){
System.out.println(“获取页面”+page.getCursor());
if(page.getCursor()==null){
返回Mono.empty();
}
整数nextCursor=(page.getCursor()==5)?null:page.getCursor()+1;
返回Mono.just(新页面(Arrays.asList(“Page”+Page.getCursor()+“-1”,“Page”+Page.getCursor()+“-2”),nextCursor));
}
静态类页面{
私有列表结果;
私有整数游标;
公共页(列表结果,整数光标){
this.result=结果;
this.cursor=游标;
}
公共列表getResult(){
返回结果;
}
公共整数getCursor(){
返回光标;
}
}
}
不错。我使用这个概念来处理分页。只想确认一下,当返回Mono.empty()
时,它将退出展开
链和flatMap
无论现有的iterable是什么?