使用HTTP范围标头除了字节以外的范围说明符?

时间:2009-09-16 18:18:21

标签: ajax http http-headers pagination

核心问题是使用HTTP标头,包括RangeIf-RangeAccept-Ranges和用户定义的范围说明符。

这是一个帮助说明我的问题的制作示例。假设我有一个Web 2.0样式的应用程序,它显示某种人类可读的文档。这些文档在编辑上分为几页(类似于您在新闻网站上看到的文章)。对于此示例,假设:

  • 有一个标题为“HTTP范围问题”的文件分为三页。
  • shell页面(/document/shell/http-range-question)知道有关文档的元信息,包括页数。
  • 文档的第一个可读页面在页面onload事件期间通过ajax GET加载并插入页面。
  • 看起来像 [1 2 3 All] 的UI控件位于页面底部,单击数字将显示该可读页面(也通过ajax加载),然后单击“所有“将显示整个文档。假设这些URL用于1,2,3和所有用例:
    • /document/content/http-range-question?page=1
    • /document/content/http-range-question?page=2
    • /document/content/http-range-question?page=3
    • /document/content/http-range-question

现在回答这个问题。我可以使用HTTP Range标头而不是URL的一部分(例如查询字符串参数)吗?在GET /document/content/http-range-question请求中可能是这样的:

Range: page=1

看起来规范只定义了字节范围是允许的,所以即使我让我的ajax调用与我的浏览器和服务器代码一起使用,中间的任何东西都可以破坏合同(例如缓存代理服务器)。

Range: bytes=0-499

自定义范围说明符的任何意见或现实世界的例子?

更新:我确实发现了一个关于Range标头(Paging in a Rest Collection)的类似问题,他们提到Dojo的JsonRestStore使用自定义Range标头值。

Range: items=0-24

4 个答案:

答案 0 :(得分:33)

绝对 - 您可以自由指定任何您喜欢的范围单位。

来自RFC 2616:

  

3.12范围单位

     

HTTP / 1.1允许客户端请求   只有部分(一系列)的   响应实体包含在   响应。 HTTP / 1.1使用范围单位   在范围内(第14.35节)和   内容范围(第14.16节)
  标题字段。一个实体可以被打破   按照下面的子范围   各种结构单位。

  range-unit       = bytes-unit | other-range-unit
  bytes-unit       = "bytes"
  other-range-unit = token
     

唯一定义的范围单位   HTTP / 1.1是“字节”。 HTTP / 1.1
  实现可以忽略范围   使用其他单位指定。

关键部分是最后一段。实际上它说的是,当他们为HTTP / 1.1编写规范时,他们只概述了“字节”令牌。但是,正如您可以从“其他范围单位”位看到的那样,您可以自由地提出自己的令牌说明符。

使用您自己的Range说明符确实意味着您必须控制使用该说明符的客户端和服务器代码。因此,如果您拥有暴露“/ document / content / http-range-question”URI的后端部分,那么您很高兴;大概你正在使用一个现代的Web框架来检查进入的请求标头。然后你可以查看Range值来正确执行支持查询。

此外,如果您控制向后端发出请求的AJAX代码,您应该能够自己设置Range标头。

但是,您可能会在自己的问题中预见到一个潜在的缺点:打破缓存的可能性。如果您使用自定义范围单元,则客户端与原始服务器之间的任何缓存“可以忽略使用[字节'以外的单位]”指定的范围。例如,如果您在前端和后端之间有一个Squid / Varnish缓存,则无法保证您希望的结果将从缓存中提供!

您可能还会考虑另一种实现方法,而不是使用查询字符串,而是将页面作为URI的“参数”;例如:/ document / content / http-range-question / page / 1。对于服务器端来说这可能会有一些工作,但它符合HTTP / 1.1并且缓存应该正确对待它。

希望这有帮助。

答案 1 :(得分:0)

HTTP范围通常用于恢复中断的下载而不从头开始。

OAI-ORE可以更好地处理您尝试做的事情,它允许您定义多个文档之间的关系。 (替代格式,整体的组成部分等)

不幸的是,这是一种相对较新的元数据格式,我不知道任何带有原生支持的网络浏览器。

答案 2 :(得分:0)

bytes是HTTP 1.1规范支持的唯一单元。

答案 3 :(得分:-2)

听起来您只想更改HTTP规范以删除查询字符串参数。为了做到这一点,你必须修改客户端上的代码以发送修改后的头和服务器以从“Range”头而不是查询字符串中读取。

最终结果是,这可能会有效,但是你要破坏所有标准和现有工具。