RESTful 设计:分页集合

Posted

技术标签:

【中文标题】RESTful 设计:分页集合【英文标题】:RESTful Design: Paging Collections 【发布时间】:2010-10-04 19:12:54 【问题描述】:

我正在设计一个 REST api,它需要从服务器端强制执行分页(每 x)。

浏览任何资源集合的正确方法是什么:

选项 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=。但我认为根据上述选项判断,您有更多关于您的设计的基本问题需要回答。 :) 你的意思是因为我必须使用分页? 也许看看***.com/questions/924472/paging-in-a-rest-collection 【参考方案1】:

由于我对 REST 的理解有限,那么以下内容可能是“最”宁静的。

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

由于表示的内容永远不会发生意外变化,因此可以使用缓存。

但要真正回答你的问题,我认为参数页面是首选方法。

【讨论】:

不仅如此,分页也不是资源的一部分。无论您是否使用分页,以及以何种形式,都不会改变资源,只是您要求查看它的方式。排序顺序,甚至过滤也是如此。 @Dave Van den Eynde:那是错误的。 RFC 3986(URI 通用语法)状态(第 3.4 节):“查询组件包含非分层数据, 连同路径组件中的数据(第 3.3 节), 用于标识资源 在 URI 的方案和命名权限(如果有)范围内”(我的突出显示)。第二页是与第一页不同的资源。但无论如何,它与 RESTfulness 无关。 根据该 RFC,URI 的“片段”部分应该用于分页/排序。但我严重怀疑此 RFC 是否适用于此。你试过这个吗?我认为浏览器不会区分只有片段不同的两个 URI。也许我应该换个说法。如果在 REST api 中,“资源”确实是由 PATH 标识的,那么 QUERY 可用于通过分页/排序来完成资源。但是对于 REST,什么是“资源”,不同于 URI 上下文中的资源。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

不错的链接 - 我之前没看过那个 RFC。

以上是关于RESTful 设计:分页集合的主要内容,如果未能解决你的问题,请参考以下文章

Restful API 的设计规范

Restful精品资源集合

RESTful最佳实践

Restful API 的设计规范(转)

Restful接口设计

RESTful 服务中的分页