【问题标题】:Flexible HTTP paging灵活的 HTTP 分页
【发布时间】:2014-01-11 16:10:45
【问题描述】:

我正在通过 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 个项目的情况下发送请求。我的意思是,在不指定任何 Range 标头的情况下,默认情况下每页应该有 32 个项目......并且来自服务器的响应代码为 206。因为我想让客户忘记Range 标头。使用 API 会更简单。

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

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

你怎么看?

【问题讨论】:

    标签: api rest http-headers


    【解决方案1】:

    注意RFC states:

    代理可以丢弃范围 包含无法理解的范围单位的标头字段。

    因此,当您的客户端位于代理后面时,range 标头可能会被丢弃。

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

    这应该不会太难。伪:

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

    【讨论】:

    • 感谢您提供有关代理的提示。但是根据您对这个 RFC 的解释,是否可以在 GET 请求之后从服务器到客户端回答一个 206 分页集合,而没有从客户端到服务器的任何 Range 标头?
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2012-03-04
    • 1970-01-01
    • 2011-11-13
    • 2011-10-08
    • 2021-12-18
    相关资源
    最近更新 更多