当前位置: 首页 > 面试题库 >

将HTTP Range Header与字节以外的范围说明符一起使用?

匡翰
2023-03-14
问题内容

核心问题是有关HTTP标头的使用,包括Range,If-
Range
,Accept-
Ranges
和用户定义的范围说明符。

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

  • 有一个标题为“ HTTP范围问题”的文档分为三页。
  • 外壳页面(/document/shell/http-range-question)知道有关文档的元信息,包括页面数。
  • 文档的第一个可读页面是在页面onload事件期间通过ajax GET加载的,并插入到页面上。
  • 一个看起来像 [1 2 3全部] 的UI控件位于页面的底部,单击数字将显示该可读页面(也通过ajax加载),然后单击“全部”将显示整个文档。假设针对1、2、3和所有用例的以下URL:
    • /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的一部分(例如querystring参数)吗?也许这样的GET /document/content/http-range-question要求:

Range: page=1

看起来该规范仅将字节范围定义为允许的范围,因此,即使我使ajax调用与我的浏览器和服务器代码一起使用,中间的任何内容也可能破坏合同(例如,缓存代理服务器)。

Range: bytes=0-499

关于自定义范围说明符的任何观点或现实示例?

更新 :我确实找到了有关Range标头在Rest
Collection中分页的类似问题,他们提到Dojo的JsonRestStore使用定义Range标头值。

Range: items=0-24

问题答案:

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

根据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规范时,他们只概述了“字节”令牌。但是,正如您从“其他范围单位”位可以看到的那样,您可以自由提出自己的令牌说明符。

提出自己的范围说明符确实意味着您必须控制使用该说明符的客户端和服务器代码。因此,如果您拥有公开“ / document / content / http-
range-question”
URI的后端,那您就很好了。大概您正在使用一个现代的Web框架,该框架可让您检查传入的请求标头。然后,您可以查看Range值以正确执行后备查询。

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

但是,您可能会想到一个潜在的弊端:破坏缓存的潜力。如果使用的是自定义范围单位,则客户端和原始服务器之间的所有高速缓存“可能会忽略使用[字节以外的单位]指定的范围”。因此,例如,如果您在前端和后端之间有一个Squid
/ Varnish缓存,则不能保证您希望的结果将从缓存中得到!

您可能还会考虑一种替代实现,其中使页面成为URI的“参数”而不是使用查询字符串。例如:/ document / content / http-range-
question / page / 1。对于您的服务器端来说,这可能需要做更多的工作,但是它是HTTP / 1.1兼容的,因此缓存应该适当地对待它。

希望这可以帮助。



 类似资料:
  • 问题内容: 我在阅读一些代码时碰到了这一点,但我完全不知道这意味着什么。我尝试使用谷歌搜索,但是什么也没找到,可能是由于缺少词汇。代码: 我到目前为止所知道的: 因此,我对“公共最终类ClassName扩展”部分没有任何疑问,但是我不理解在超类名称中是否存在点/范围解析运算符。首先,我想有人会说“ Java没有范围解析运算符”之类的东西,以澄清Java和Cpp / other-OOP语言之间的细微

  • 我正在使用Grammar::Tracer进行以下设置: p、 p6 MyGrammar.pm6: 但是没有启用跟踪。我猜是因为语法不在语句的词汇范围内?

  • 如何修复“定义签名数据范围的意外字节范围值”。详细信息:使用PDFBOX在多个页面中添加外部签名时,签名字节范围无效(2.0.12) 以下代码适用于单页签名,而多页签名不起作用。 准备好哈希后,正在发送到另一台服务器以获取签名。在获得响应后,将签名添加到pdf中。 签名验证时出错。 定义签名数据范围的意外字节范围值。 详细信息:签名字节范围无效

  • 我已经看过了所有的文档,似乎没有办法做到这一点,但是: 有没有一种方法可以将argparse与任何字符串列表一起使用,而不是只与sys.argv一起使用?

  • 对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时

  • 接口说明 Web Uploader的所有代码都在一个内部闭包中,对外暴露了唯一的一个变量WebUploader,所以完全不用担心此框架会与其他框架冲突。 内部所有的类和功能都暴露在WebUploader名字空间下面。 Demo中使用的是WebUploader.create方法来初始化的,实际上可直接访问WebUploader.Uploader。 var uploader = new WebUplo