这是这个问题的一个更通用的重新表述(消除了Rails特定的部分)
我不确定如何在RESTful web应用程序中实现资源分页。
假设我有一个叫做产品的资源,你认为以下哪一个是最好的方法,为什么:
1. 只使用查询字符串
如。http://application/products?page=2&sort_by=date&sort_how=asc
这里的问题是,我不能使用全页缓存,而且URL不是很干净,容易记住。
2. 使用页面作为资源和查询字符串进行排序
如。http://application/products/page/2?sort_by=date&sort_how=asc
在这种情况下,我们看到的问题是http://application/products/pages/1不是唯一的资源,因为使用sort_by=price可以产生完全不同的结果,我仍然不能使用页面缓存。
3.使用页面作为资源,并使用URL段进行排序
如。http://application/products/by-date/page/2
我个人认为使用这种方法没有问题,但有人警告我这不是一个好的方法(他没有给出理由,所以如果你知道为什么不推荐,请告诉我)
任何建议,意见,批评都是非常欢迎的。谢谢。
我目前正在我的ASP中使用类似于此的方案。NET MVC应用程序:
例如,http://application/products/by-date/page/2
具体来说是:http://application/products/Date/Ascending/3
但是,我并不喜欢以这种方式在路由中包括分页和排序信息。
项目列表(在本例中为产品)是可变的。也就是说,下次有人返回包含分页和排序参数的url时,他们得到的结果可能已经改变了。因此,将http://application/products/Date/Ascending/3作为指向一组确定的、不变的产品的唯一url的想法就消失了。
HTTP有很好的范围头,也适合分页。你可以发送
Range: pages=1
只有第一页。这可能会迫使您重新考虑什么是页面。也许客户想要不同范围的产品。Range头也可以用于声明订单:
Range: products-by-date=2009_03_27-
让所有的产品更新日期或
Range: products-by-date=0-2009_11_30
让所有的产品都比这个日期更老。'0'可能不是最好的解决方案,但RFC似乎想要一些范围开始。可能部署的HTTP解析器不会解析units=-range_end。
如果标题不是一个(可接受的)选项,我认为第一个解决方案(所有在查询字符串)是一种处理页面的方式。但是,请规范化查询字符串(按字母顺序排序(键=值)对)。这就解决了?A =1&b=x" and "?B =x&a=1"的微分问题。
为了寻找最佳实践,我看到了这个网站:
http://www.restapitutorial.com
在参考资料页中有一个链接,可以下载一个.pdf文件,其中包含作者建议的完整REST最佳实践。其中有一节是关于分页的。
作者建议同时支持使用Range头和使用查询字符串参数。
请求
HTTP报头示例:
Range: items=0-24
查询字符串参数示例:
GET http://api.example.com/resources?offset=0&limit=25
其中offset是开始项数,limit是返回的最大项数。
响应
响应应该包括一个Content-Range报头,指示有多少项正在返回,以及总共有多少项尚待检索
HTTP报头示例:
Content-Range: items 0-24/66
Content-Range: items 40-65/*
在.pdf文件中,还有一些针对更具体情况的其他建议。