哪种分页方法更适合其余api(页面,大小)或(限制,偏移量)

时间:2019-05-09 11:55:13

标签: java spring rest hyperlink hateoas

我搜索了很多堆栈溢出的答案,文章,但对此一无所知,这就是为什么我问这个问题,

参考文献:10 Best Practices for Better RESTful API

我只是想知道在其余api中进行分页时应该使用什么, 在spring框架中,他们默认提供(page,size)以在api中实现分页,我认为使用(page, size)更具可读性,并且比(limit, offset)更有意义,spring是否提供了任何理由?默认情况下,(page,size)而非限制,偏移量,许多答案都证明(limit,offset)(page,size)更好。

  

https://somewhere.com/results?page=1&size=20

     

https://somewhere.com/results?limit=20&offset=0

3 个答案:

答案 0 :(得分:2)

在Page / PageSize与Offset / Limit中,使用Page / PageSize更为简单,因为每个页面上的PageSize相等,但是如果您要定位特定范围的项目,则使用Offset / Limit可以为您提供更精确的数据,并且使用Page / PageSize方法执行此操作。下图显示了两者之间的关系:

enter image description here

在第一个区块上,如果您将项目6定位为项目8,则您的PageSize为3:

Limit = PageSize = 3
Page = 3 // from the first block above, item 6 to item 8 sits on Page 3
Offset = (Page * PageSize) - PageSize
Offset = (3 * 3) - 3
Offset = 6

在第二个块上,如果您将项目7定位到项目9,则您的PageSize再次为3:

Limit = PageSize = 3
Page = 3.3333 // from the 2nd block, item 7 to item 9 sits exactly in Page = 3.3333, and not in Page = 3
Offset = (Page * PageSize) - PageSize
Offset = (3.3333 * 3) - 3
Offset = 9.9999 - 3
Offset = 7 

在第三个区块上,您将第7项定位到第10项,因此您的PageSize = 4:

Limit = PageSize = 4
Page = 2.75 // from the 3rd block, item 7 to item 9 sits exactly in Page = 2.75, and not in Page 3, if the PageSize is 4
Offset = (Page * PageSize) - PageSize
Offset = (2.75 * 4) - 4
Offset = 11 - 4
Offset = 7 

很可能Offset是目标项目的起始索引,Limit是目标项目的计数。我只是向您展示这两种方法的关系。

答案 1 :(得分:1)

例如,如果您不使用spring,则限制和偏移量在代码中更容易使用,可以将这些值直接传递给dbms。

对于页面和大小,您必须计算偏移和限制值。如果是框架,它将为您完成工作。

但是我认为,没有做到这一点的“最佳方法”。两种解决方案都适用于多种情况。

答案 2 :(得分:1)

我使用page&limit方法。恕我直言,这些是参数的最佳名称。所以它会像这样:

https://somewhere.com/results?page=1&limit=10

我找不到关于“如何做”问题的明确答案。