RESTful设计:分页集合

14

我正在设计一个需要服务器端进行分页(每x个资源一页)的REST API。

在任何资源集合中进行分页的正确方式是什么:

选项1:

GET /resource/page/<pagenr>
GET /resource/tags/<tag1>,<tag2>/page/<pagenr>
GET /resource/search/<query>/page/<pagenr>

选项 2:

GET /resource/?page=<pagenr>
GET /resource/tags/<tag1>,<tag2>?page=<pagenr>
GET /resource/search/<query>?page=<pagenr>
如果是1,那么对于 GET /resource 我应该怎么做?重定向到 /resource/page/0,回复一些错误或者直接回复与 /resource/page/0 完全相同的内容而不进行重定向?

个人而言,我会选择page=<pagenr>。但是根据上面的选项,我认为您需要回答更基本的设计问题。 :) - Andy Hume
你的意思是因为我必须使用分页吗? - Koen Bok
也许可以看一下https://dev59.com/jXNA5IYBdhLWcg3wh-YC - zehrer
3个回答

13

URI的外观并不是最重要的部分。相反,您应该考虑的是如何向用户呈现它。例如,一个页面应该有一个到“下一页”的链接,另一个链接到“上一页”(如果有的话)。请参阅RFC 5005 Feed Paging and Archiving


不错的链接 - 我以前没有看过那个RFC。 - ladenedge

4

就我有限的了解,REST 的核心思想是“表现层状态转化”,那么以下可能是最符合 REST 的实践。

GET /resource/?page=<pageenr>&asof=<datetime>

考虑到表达内容不会出现意外变化并且可以使用缓存,因此缓存是可行的。

但实际上回答您的问题,我认为参数页面是首选的方法。


1
不仅如此,分页也不是资源的一部分。无论您是否使用分页以及以何种形式使用,都不会改变资源本身,只会改变您请求查看资源的方式。同样适用于排序顺序,甚至过滤。 - Dave Van den Eynde
1
@Dave Van den Eynde:那是错误的。RFC 3986(URI通用语法)规定(第3.4节):“查询组件包含非分层数据,与路径组件中的数据一起,用于识别URI方案和命名权限(如果有)范围内的资源”(我强调了一下)。第二页是不同的资源,与第一页无关。但无论如何,这与RESTfulness无关。 - mogsie
根据该RFC,URI的“片段”部分应用于分页/排序。但我严重怀疑这个RFC是否适用于此处。你试过这个方法吗?我认为浏览器不会区分仅在片段不同的两个URI。也许我应该用不同的措辞来表达这个意思。如果在REST api中,“资源”确实是由路径所识别的内容,那么可以使用查询来完成带有分页/排序的资源。但是对于REST来说,“资源”的含义与URI上下文中的资源不同。 - Dave Van den Eynde

4

我会选择选项(2)。为什么?

  1. 您可以随后将页面大小参数添加到查询中,以便客户端可以指定页面大小。
  2. 如果未指定页面参数,则可以返回第一页(默认值)。在许多情况下,您的客户端可能只需要第一页,因此简化了客户端和服务器之间的协议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接