Pagination 在restful url上编码分页信息的标准方法?

Pagination 在restful url上编码分页信息的标准方法?,pagination,rest,friendly-url,Pagination,Rest,Friendly Url,我想我的问题最好用几个例子来解释 获取asc 也就是说,一方面我有条件(name=xxx&country=xxxx),另一方面我有影响查询的参数(\u page=3&\u page\u len=10&\u order=name asc) 现在,我考虑使用一些特殊的前缀(在本例中为“u”)来避免条件和参数之间的冲突(如果我的资源有一个“order”属性怎么办?) 是否有一些标准的方法来处理这些情况 -- 我找到了这个例子(只是挑一个) 得到 但在这种情况下,条件字段已经定义(没有开始或结束属性)

我想我的问题最好用几个例子来解释

获取asc

也就是说,一方面我有条件(name=xxx&country=xxxx),另一方面我有影响查询的参数(\u page=3&\u page\u len=10&\u order=name asc)

现在,我考虑使用一些特殊的前缀(在本例中为“u”)来避免条件和参数之间的冲突(如果我的资源有一个“order”属性怎么办?)

是否有一些标准的方法来处理这些情况

--

我找到了这个例子(只是挑一个)

得到

但在这种情况下,条件字段已经定义(没有开始或结束属性)

我在寻找一些通用的解决方案

-- 编辑,一个更详细的例子来澄清

每一项都是完全独立的。。。假设我的资源是客户,而且(幸运的是)我的数据库中有数百万个客户

所以url可以是

它应该能告诉我去年从阿根廷买东西的所有客户

现在我想使用这个服务来构建一个浏览页面,或者用ajax来填充一个组合,所以我的想法是添加一些metada来控制我应该获得什么信息

要构建浏览页面,我将添加

并用ajax填充自动建议组合

*

要使用与用户键入内容匹配的前100个客户填充组合


我的问题是,是否有某种标准的(书面的或非书面的)方式来以restfull url的方式对这类内容进行编码…

没有标准或惯例来定义这样做的方式,但使用下划线(一个或两个)来表示元信息并不是一个坏主意。在某些语言中,这是用来按照约定指定成员变量的。

我知道RESTful的人倾向于不喜欢使用HTTP头,但实际上有人考虑过使用HTTP头来解决分页问题。几年前,我编写了一个ISAPI扩展,它在URI中包含分页信息和其他非属性信息,我从来都不喜欢这种感觉。我在考虑做一些事情,比如:

GET http://...?name=xxx&country=xxxx&_orderby=name&_order=asc HTTP/1.1
Range: pageditems=20-29
...
http://.../myresource/page-10/3?name=xxx&country=yyy&order=name&orderby=asc
http://.../myresource/item/42
http://.../myresource/item/307E8599-AD9B-4B32-8612-F8EAF754DFDB
这会将结果集参数(例如,
\u orderby
\u order
)放入URI中,并将选择作为
范围
标题。我有一种感觉,大多数HTTP实现都会搞砸这一点,尤其是因为RFC2616中可能会支持非字节范围。在和我做了一系列工作之后,我开始更认真地思考这个问题。是扩展范围以处理时间和字节的一个很好的例子

我想另一种处理方法是对页面上的每一项单独请求,作为单独的资源。如果您的代理允许这样做,那么您可能需要考虑它。更可能的情况是,中间缓存可以很好地使用这种方法。因此,您的资源将被定义为:

myresource/name=xxx;country=xxx/orderby=name;order=asc/20/
myresource/name=xxx;country=xxx/orderby=name;order=asc/21/
myresource/name=xxx;country=xxx/orderby=name;order=asc/22/
myresource/name=xxx;country=xxx/orderby=name;order=asc/23/
myresource/name=xxx;country=xxx/orderby=name;order=asc/24/
我不确定是否有人尝试过这样的东西。这将使URI可构造,这始终是IMHO的一个有用属性。这种方法的好处是,可以缓存单个响应,服务器可以自由地优化收集项目页面的处理,而不是以最有效的方式。基本思想是让客户机在URI中指定查询以及它想要检索的项目的索引。无需将“页面”的概念推入资源中,甚至无需使其可见。客户端可以迭代地检索对象,直到其页面已满或收到404

当然还有一个缺点。。。HTTP服务器和基础设施必须支持,否则创建/破坏连接的成本可能会彻底扼杀这一想法。


注意: 我开始写这篇文章作为对他的评论。然后我打算把它添加为编辑,但我认为它应该作为一个单独的答案。这是一种完全不同的方法,也是一个单独的答案,因为这是一种不同的方法


我越想这个问题,我认为你真的有两种不同的资源需要处理:

  • 参考资料的一页
  • 收集到页面中的每个资源
  • 我可能错过了什么(可能是……我有误解之罪)。由于页面本身就是一种资源,因此分页元信息实际上是资源的一个属性,因此将其放在URL中并不一定是错误的方法。如果考虑可以在页面下游缓存和/或将来称为资源的资源,则由分页属性和查询参数定义资源,因此它们都应该在URL中。要继续我太长的回复,页面资源如下所示:

    GET http://...?name=xxx&country=xxxx&_orderby=name&_order=asc HTTP/1.1
    Range: pageditems=20-29
    ...
    
    http://.../myresource/page-10/3?name=xxx&country=yyy&order=name&orderby=asc
    
    http://.../myresource/item/42
    http://.../myresource/item/307E8599-AD9B-4B32-8612-F8EAF754DFDB
    
    我认为这是你最初问题的核心。如果页面本身是一个资源,那么URI应该描述页面,这样类似于
    page-10
    的内容就是我说的“一个包含10项的页面”,页面的下一部分是页码。查询部分包含过滤器

    其他资源为页面包含的每个项目命名。项目的识别方式应由资源的种类来控制。我认为一个关键问题是结果资源是否独立。基于此概念,表示项目资源的方式有所不同

    如果项表示仅在页面上下文中才合适,则可能适合内联包含表示。如果您这样做,那么请分别识别它们,并确保可以使用或检索它们。似乎以下URL应该会导致第三页的第五项,共十项:

    http://.../myresource/page-10/3?...#5
    http://.../myresource/page-10/3/5?...
    
    决定这两者之间的最大因素是单个项目与