核心问题是使用HTTP标头,包括Range,If-Range,Accept-Ranges和用户定义的范围说明符。
这是一个帮助说明我的问题的制作示例。假设我有一个Web 2.0样式的应用程序,它显示某种人类可读的文档。这些文档在编辑上分为几页(类似于您在新闻网站上看到的文章)。对于此示例,假设:
/document/shell/http-range-question
)知道有关文档的元信息,包括页数。/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
答案 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”头而不是查询字符串中读取。
最终结果是,这可能会有效,但是你要破坏所有标准和现有工具。