【发布时间】:2018-08-16 20:00:10
【问题描述】:
下面有两个示例,展示了使用 REST 进行分页的两个相互竞争的实现。哪个更“正确”?
在以下两种情况下,我都使用标准的Link HTTP 标头将 URL 添加到下一页、上一页、第一页和最后一页。
在响应正文中描述页面
GET /foo?page=1&count=3
Content-Type: application/json
Link: </foo?Page=2&Count=3>; rel="next", </foo?Page=1&Count=3>; rel="first", </foo?Page=2&Count=3>; rel="last"
{
"page": 1,
"count": 3,
"totalCount": 9,
"totalPages": 2,
"items": [
{ "item": 1 },
{ "item": 2 },
{ "item": 3 }
]
}
我听说这不是 REST'ful,因为它改变了资源响应体。但是,如果您将 URL 更改为 /foo/pages?page=1&count=3,现在您描述的是 page 资源而不是 foo 资源。
链接和 X-Pagination HTTP 标头
GET /foo?page=1&count=3
Content-Type: application/json
Link: </foo?Page=2&Count=3>; rel="next", </foo?Page=1&Count=3>; rel="first", </foo?Page=2&Count=3>; rel="last"
X-Pagination: { "page": 1, "count": 3, "totalCount": 9, "totalPages": 3 }
[
{ "item": 1 },
{ "item": 2 },
{ "item": 3 }
]
使用这种方法意味着响应正文没有改变,但是我使用了一个非标准的 HTTP 标头来描述项目总数和总页数。
【问题讨论】:
-
我真的很想知道你为什么需要通过 REST 来解决这个问题。分页应该是管理客户端。我建议以您可以提交“开始”和“限制”参数的方式构建您的 REST-GET,它不需要了解任何关于页面的信息。
-
我肯定会选择第一个选项并且总是有一个
"items"键。 -
@Ryan Care 详细说明为什么?
标签: json rest http http-headers restful-architecture