这是这个问题的一个更通用的重新表述(消除了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 我个人认为使用这种方法没有问题,但有人警告我这不是一个好的方法(他没有给出理由,所以如果你知道为什么不推荐,请告诉我)

任何建议,意见,批评都是非常欢迎的。谢谢。


当前回答

我同意Fionn的观点,但我还要进一步说明,对我来说Page不是资源,而是请求的属性。这使得我只选择选项1查询字符串。感觉很好。我真的很喜欢Twitter API的结构。不太简单,也不太复杂,有很好的文档。无论是好是坏,这是我的“go to”设计,当我在做某件事的一种方式和另一种方式之间犹豫不决时。

其他回答

奇怪的是,没有人指出选项3的参数是按特定顺序排列的。 http / /应用程序/产品/日期/降/名称/升/页面/ 2 而且 http / /应用程序/产品/名称/升/日期/降/页面/ 2

指向相同的资源,但有完全不同的url。

对我来说,选项1似乎是最可接受的,因为它清楚地区分了“我想要什么”和“我想要什么”(它甚至在它们之间有问号,哈哈)。全页面缓存可以使用完整的URL实现(所有选项都会遇到相同的问题)。

使用参数在URL方法的唯一好处是干净的URL。尽管你必须想出一些方法来编码参数并无损地解码它们。当然,你可以使用URLencode/decode,但这将使url再次丑陋:)

我倾向于同意slf的观点,即“页面”并不是真正的资源。另一方面,选项3更干净,更容易阅读,用户可以更容易地猜到,甚至在必要时输入。我在选项1和选项3之间犹豫不决,但没有任何理由不使用选项3。

另外,虽然它们看起来很好,但使用隐藏参数的一个缺点,而不是查询字符串或URL段,用户不能收藏或直接链接到特定的页面。根据应用程序的不同,这可能是问题,也可能不是问题,但只是需要注意的问题。

我一直使用选项1的风格。在我的例子中,缓存并不是一个问题,因为数据经常变化。如果您允许页面的大小是可配置的,那么数据就不能被缓存。

我不觉得url难记或不干净。对我来说,这是查询参数的一个很好的使用。资源显然是一个产品列表,查询参数只是告诉您希望如何显示该列表—排序和哪个页面。

我使用in下面的模式来获得下一页记录。 http://application/products?lastRecordKey=?&pageSize=20&sort=ASC

RecordKey是数据库中保存顺序值的表的列。这用于一次只从DB中获取一个页面数据。 pageSize用于确定获取多少条记录。Sort用于按升序或降序对记录进行排序。

我以前用过解决方案3(我写了很多django应用程序)。我不认为这有什么问题。它就像其他两个一样可生成(以防你需要做一些大规模的刮擦或类似的事情),它看起来更干净。另外,你的用户可以猜网址(如果它是一个面向公众的应用程序),人们喜欢能够直接去他们想去的地方,猜网址感觉很强大。