java - 对于rest api的(页面,大小)或(限制,偏移量),哪种分页方法更好

标签 java spring rest hyperlink hateoas

我搜索了很多堆栈溢出的答案、文章,但无法得到具体的想法,这就是我问这个问题的原因,

引用文献:10 Best Practices for Better RESTful API

我只是想知道当我们在rest api中进行分页时我们应该使用什么, 在 Spring 框架中,他们默认提供 (page,size) 来实现 api 中的分页,我认为使用 (page, size) 更具人类可读性并且更有意义,而不是(limit, offset),Spring默认提供(page,size)而不是limit,offset有什么原因吗?许多答案都是为了证明 (limit,offset)(page,size) 更好。

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

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

最佳答案

在 Page/PageSize 与 Offset/Limit 中,使用 Page/PageSize 更简单,因为所有 Page 的 PageSize 都是相同的;但是,如果您针对特定范围的项目,则使用 Offset/Limit 可以为您提供更精确的数据,而使用 Page/PageSize 方法则无法做到这一点。下图展示了两者之间的关系:

enter image description here

在第一个 block 中,如果您的目标是第 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

在第二个 block 上,如果您的目标是第 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 

在第三个 block 上,您的目标是第 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 

显然,偏移量是目标项目的起始索引,限制是您要定位的项目的数量。我只是向您展示这两种方法的关系。

关于java - 对于rest api的(页面,大小)或(限制,偏移量),哪种分页方法更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058882/

相关文章:

java - 哈希表。怎么运行的?

java - Apache camel,一条通往 "join"2条路线的路

json - Jackson JSON 序列化 - 指定递归级别

python - 如何在 django 中仅添加第三方应用程序所需的 url?

c# - 非持久性 HTTP 1.1 连接比持久性连接更快?

php - 通过我的 REST API 连接 Google REST API 无效

java - 如何将样式应用到行直到 Apache POI 中的特定单元格

java - 如何使用输出中的部分输入替换文本?

spring - 在 Spring Rest 中使用 JSON 的 HTTP POST

java - 从 spring Controller 返回 csv 文件时的奇怪行为