在RESTful Web服务中设计分页端点的最佳方法

时间:2014-11-21 02:44:35

标签: web-services api rest web pagination

我的RESTful Web服务上有/entities端点,如果使用GET请求调用,则返回全部数据库中存储的实体。

我现在要创建的是分页功能。能够仅检索这些结果的页面而不是所有实体,只是为了最小化响应的大小。

我正在考虑两种方法。

  1. 使用/entities请求在GET端点上通过查询参数发送分页信息。例如,/entities?page=1&size=10

  2. 使用其他HTTP Method,例如OPTIONS(我知道它不适合用于此类事情)。我不会在我的Web服务上处理OPTIONS个请求,我可以利用它,同时保持RESTful Web服务的本质,即使用不同的HTTP Methods进行不同的操作。在这种情况下,端点可能是这样的:/entities/1/10,(我认为)更用户友好

  3. 两种替代方案都可以实现,我想事先知道哪一个更符合REST设计标准。

3 个答案:

答案 0 :(得分:3)

正如aljo所提到的,没有官方标准。但是我在寻找最佳实践时遇到了这个网站:

http://www.restapitutorial.com

在资源页面中有一个下载.pdf的链接,其中包含作者建议的完整REST最佳实践。除此之外还有一个关于分页的部分。

作者建议使用Range标头和使用查询字符串参数添加对两者的支持。

请求

HTTP标头示例:

Item item;
item.Editing.BeginEdit();
item.Fields["fieldname"].Value += "|{652FD742-AAE3-468D-81BE-7EF18E06B796}";
item.Editing.EndEdit();

查询字符串参数示例:

Range: items=0-24

其中 offset 是开始项目编号, limit 是要返回的最大项目数。

<强>响应

响应应包含一个Content-Range标头,指示要返回的项目数以及尚未检索的项目总数

HTTP标头示例:

GET http://api.example.com/resources?offset=0&limit=25

在.pdf中,针对更具体的案例还有其他一些建议。

答案 1 :(得分:0)

我相信没有正式的标准&#34;用于RESTful Web服务。但是不同供应商提出了许多建议/实施方案。

您的第一种方式,使用查询参数将是正确的。不同的HTTP方法(GET,PUT,DELETE,POST)用于不同类型的操作。我从来没有听说过他们被用来修改现有的操作。

请参阅Wikipedia - REST

答案 2 :(得分:0)

基于HATEOAS(作为应用程序状态引擎的超媒体)标准,响应应该与上一页和下一页链接。

/entities?page=1&size=10/entities/1/10更为可取,因为(严格来说)1/10不是要通过URI定位的资源。