核心问题是关于使用HTTP标头,包括范围 , 如果型 , 接受-范围和用户定义的范围指定。
这里是一个制造例子来帮助说明我的问题。 假设我有一个显示某种人类可读的文档的一个Web 2.0风格的应用程序。 这些文件的社论分成页(类似于你看到新闻网站的文章)。 在这个例子中,假设:
- 有名为“HTTP范围问题”被分成三页的文档。
- 壳页面(
/document/shell/http-range-question
)知道该文档的元信息,包括页面的数量。 - 的文档的第一页可读经由AJAX GET的页面onload事件期间被加载,并插入到页面上。
- 看起来像[1 2 3全部]是在页面的底部,并点击一个号码将显示可读页面(也通过AJAX加载),并点击UI控制“全部”将显示整个文档。 假定这些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范围头中的URL(如查询参数),而不是一部分? 也许是这样的GET /document/content/http-range-question
要求:
Range: page=1
它看起来像只规范定义为可允许的,所以即使我做了我的Ajax调用与我的浏览器和服务器代码,中间可能会撕毁合同(例如缓存代理服务器)的任何工作字节范围。
Range: bytes=0-499
定制范围符的任何意见或真实世界的例子吗?
更新 :我没有找到有关范围的报头(一个类似的问题寻呼在休息集合 ),他们提到,Dojo的JsonRestStore使用自定义的范围标头值。
Range: items=0-24
当然 - 你可以自由地指定你喜欢的任何范围的单位。
从RFC 2616:
3.12范围单位
HTTP / 1.1允许客户请求唯一部分(的范围)的
响应实体被包括在响应中。 HTTP / 1.1使用范围在范围单位(节14.35)和Content-范围(部分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规范,他们只列出了“字节”令牌。 但是,正如你可以从“其他范围单元”位看,你可以自由地拿出自己的标记符。
未来与自己的距离符意味着你必须有在使用该说明符的客户端和服务器代码控制。 所以,如果你自己的后端部分暴露了“/文件/内容/ HTTP范围-问题” URI,你是好去; 想必您使用的是现代的Web框架,可以让你检查请求头进来,你可以再看看范围数值才能正确执行后盾查询。
此外,如果你控制了AJAX代码,使请求到后端,你应该能够设置范围标头自己。
但是,你在你的问题预见到潜在的缺点:打破缓存的潜力。 如果您使用的是自定义的范围单元,您的客户端和源服务器之间的高速缓存“可能会忽略使用[不是‘字节’等单位]指定的范围”。 因此,举例来说,如果你有前部和后端之间的鱿鱼/清漆缓存,但也不能保证,你希望会从缓存中提供的结果!
你也可以考虑另一种实现方式,其中,而不是使用查询字符串,你让这个URI的页面中的“参数”; 例如:/文件/内容/ HTTP的范围-问题/页面/ 1。 这很可能是你的服务器端多一点的工作,但它的HTTP / 1.1兼容和缓存应该正确地对待它。
希望这可以帮助。
HTTP范围通常用于回收中断的下载而不从头开始。
你想做什么就可以通过更好地处理OAI-ORE ,它允许你定义多个文档之间的关系。 (可替代的格式,整个等的组件)
不幸的是,这是一个相对较新的元数据格式,我不知道任何Web浏览器与原生支援舰。
这听起来像你想改变HTTP规范只是删除查询参数。 为了做到这一点,你不得不同时修改客户端代码发送经过修改的标题,并从“范围”头,而不是查询字符串读取服务器。
最终的结果是,这可能会工作,但你打破所有的标准和现有的工具来做到这一点。