在REST Web应用程序中进行分页
这是对这个问题的更一般的重新表述(随着Rails特定部分的消除)
我不确定如何在RESTful Web应用程序中的资源上实现分页。 假设我有一个称为products
的资源,您认为哪种方法是最好的方法,以及为什么:
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
我个人认为使用这种方法没有问题,但有人告诫我说这不是一个好的方法(他没有给出理由,所以如果你知道为什么不推荐,请告诉我)
任何建议,意见,批评都是值得欢迎的。 谢谢。
我认为版本3的问题更多是一个“观点”问题 - 您是否将页面视为资源或页面上的产品?
如果您将该页面看作是资源,那么这是一个非常好的解决方案,因为对页面2的查询将始终生成第2页。
但是,如果您将页面上的产品视为资源,那么您有第2页上的产品可能发生更改的问题(旧产品已删除或其他),在这种情况下,URI并不总是返回相同的资源。
例如,客户存储指向产品列表页面X的链接,下次打开该链接时,该产品可能不再位于第X页上。
我同意Fionn的观点,但我会更进一步,对我说,Page 并非资源,它是请求的属性。 这使我只选择了选项1查询字符串。 它感觉不错。 我非常喜欢Twitter API的结构。 不是太简单,不太复杂,有据可查。 无论好坏,当我在围墙上做某种事情而不是另一种事情时,这就是我的“走向”设计。
HTTP有很好的Range头,它也适用于分页。 你可以发送
Range: pages=1
只有第一页。 这可能会迫使你重新思考什么是页面。 也许客户需要不同范围的项目。 范围标题也可用于声明订单:
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”和“?b = x&a = 1”的区分问题。
链接地址: http://www.djcxy.com/p/41133.html