在REST API分页资源中:当客户端请求超过最大页码数的页面时,您会返回什么?

时间:2014-09-08 12:52:59

标签: rest pagination http-status-codes

假设我们只有30个产品和一个REST API,其中QueryString参数用于分页。在下面的示例中,pagesize是每page个资源的数量。

api/products?page=1pagesize=10

当请求在最大页面上请求页面时,您更喜欢回答什么?

api/products?page=125&pagesize=10
  1. 400 - 错误请求?
  2. 404 - 未找到?
  3. 200 - 好(结果空洞)?
  4. 204 - 没有内容?

3 个答案:

答案 0 :(得分:7)

我会选择 Not Found ,因为请求的语法非常好。 See the status code explanations

答案 1 :(得分:2)

  1. 我不认为它是400,因为请求是有效的,但有一些REST API使用400超出范围错误。
  2. 如果我们说我们不必将匹配分页模板的每个URL绑定到集合资源,则
  3. 404有效。通过范围标题样式分页它将无法工作,因为页面共享相同的URL。通过查询样式分页,它是有效的。
  4. 具有空资源的200有效。请求的页面不包含项目。
  5. 204应该应用空邮件正文。您可能希望将链接发送回集合的第一页和最后一页,因此这可能不是您想要的解决方案。
  6. 所以我认为200,204和404中的任何一个都是有效的解决方案。

    • 416请求的范围不满足 - 可选我们可以使用它,它具有我们想要的确切含义,但它应该只应用于范围标题。 (注意:应该!=必须,英语是一种硬语言:D)

答案 2 :(得分:0)

@PhilLab's answer之后,我已经使用404一段时间了,现在,我发现它有点不一致。

我的API具有默认的分页参数,因此

api/products

内部翻译成

api/products?page=1&pagesize=10

没有产品时,应该返回什么?

api/products

我发现为该URL返回一个404错误,就像它使用的URL不正确一样。

但是从技术上讲,请求超出范围,因此我发现在这种情况下(总页数= 0,第1页)返回200不一致,而不是在一般超出范围的情况下(totalpages = 1,第=页)不一致2)。它将“ 0元素”的大小写设为单数。

此处的要点是,对于超出范围的参数化请求使用404,对于超出范围的非参数化请求(使用默认值进行分页)使用200,则会在两个请求之间建立差异,而在代码中,未参数化的请求只会在传入时注入默认值,然后再平等对待。其他代码层不需要知道分页参数是默认注入的。

此外,如果200响应包含分页元数据,则与200相比,客户端获得的200包含的项或页面总数要多于普通404。

最后,从实际的角度来看,我还发现更容易(更少的代码)返回200。