灵活的HTTP分页

时间:2014-01-11 16:10:46

标签: api rest http-headers

我正在通过REST API中的标头实现分页,例如:

  

默认情况下,返回多个项目的请求将分页为32个项目。

     

请求可以包含Range标头以指定其他项目。

     

特殊情况:

     
      
  • 如果请求未包含Range标头,则会返回400 Bad Request
  •   
  • 如果客户要求收集部分内容,但服务器无法提供该部分,416 Requested Range Not Satisfiable(例如收集时为空)。
  •   
  • 否则,服务器返回带有Content-Ranges标题和206 Partial Content的部分集合。
  •   
     

实施例

     

与集合相关的选项和/或要求:

curl  -u '<email>:<token>' \
      -H 'Accept: application/json; version=1.0.0' \
      -X OPTIONS \
      https://example.com/foos
     

成功时响应HTTP 200:

     
      
  • Accept-Ranges: foos
  •   
  • Allow: HEAD,GET,OPTIONS
  •   
     

获取请求:

curl  -u '<email>:<token>' \
      -H 'Accept: application/json; version=1.0.0' \
      -H 'Range: foos=100-199' \
      https://example.com/foos
     

成功时响应HTTP 206:

Accept-Ranges: foos
Content-Range: foos 100-199/1234

如果您发现任何异常,请不要犹豫批评。但我对这种行为比较满意。

但是,我也希望能够在不明确询问每页32个项目的情况下发送请求。我的意思是,默认情况下应该可以为每页提供32个项目而不指定任何Range标题...并且在服务器的响应代码中有206个。因为我想允许客户忘记Range标题。使用API​​会更简单。

如果可能,可以删除以下特殊情况:

  

如果请求未包含Range标头,则会返回400 Bad Request

您怎么看?

1 个答案:

答案 0 :(得分:0)

请注意RFC states

  

代理可以丢弃范围      标题字段,包含它不理解的范围单位。

因此,当您的客户端位于代理服务器后面时,range标头可能会被删除。

  

但是,我也希望能够在不明确询问每页32个项目的情况下发送请求。我的意思是,默认情况下每页应该有32个项目而不指定任何Range标题...

这不应该太难。伪:

if (range-header-present)
{
    range = parseRangeFromHeader();
}
else
{
    range = 0-31;
}