内容范围和范围标头之间的区别?


74

HTTP标头Content-Range和Range有什么区别?什么时候应该使用?

我正在尝试从特定的字节偏移量流式传输音频文件。我应该使用Content-Range还是Range标头?

谢谢

Answers:


82

在请求中使用范围,以请求特定范围的字节。响应中使用Content-Range来指示服务器为您提供的字节(可能与您请求的范围不同),以及整个内容的长度(如果知道)。


2
@BrunoMartinez虽然可以在请求中使用Content-Range,但从问题中可以很清楚地看出OP正在询问下载特定范围的内容。我是根据OP的要求回答的,而不是尝试对每种可以使用Content-Range的情况进行全面的描述。
Brian Campbell

3
@BrianCampbell您当然是正确的。我只是想记录下我的发现,以供后代使用。我编辑了我的答案,以确保它不会给人以您的答案有任何错误的印象。
btimby 2012年

3
@btimby没问题!感谢您提供更完整的解释;如果您从Google搜索中找到该页面,它总是很有用的。
布莱恩·坎贝尔

134

实际上,接受的答案并不完整。内容范围不仅用于响应。提供实体的请求也是合法的。

例如,HTTP PUT提供了一个实体主体,它可能仅提供了实体的一部分。因此,PUT请求可以包括Content-Range标头,该标头向服务器指示应将部分实体主体合并到实体中的位置。

例如,让我们首先使用HTTP创建然后附加到文件:

要求1:

PUT /file HTTP/1.1
Host: server
Content-Length: 1

a

要求2:

PUT /file HTTP/1.1
Host: server
Content-Range: bytes 1-2/*
Content-Length: 1

a

怎么样,让我们​​看看文件的内容...

要求3:

GET /file HTTP/1.1
Host: server

HTTP/1.1 200 OK
Content-Length: 2

aa

这允许通过HTTP进行读取和写入的随机文件访问。我只是想澄清一下,因为我正在研究我正在开发的WebDAV客户端中Content-Range的使用,所以也许这些扩展的信息将对其他人有用。


8
内容范围在请求中不合法。
Mark Nottingham

13
该评论不正确。RFC2616(w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16)并不将Content-Range标头限制为请求,而是将其绑定到“部分实体-主体”。实际上,使用该功能促进上传恢复或分块上传非常普遍。
汉克

3
我认为Content-Range可以在请求中使用。参见PUT方法的部分:w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6 - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not understand or implement and MUST return a 501 (Not Implemented) response in such cases.-请求可能包含的Content-Range头和服务器应该考虑到这一点。
nietaki 2013年

2
@nietaki当然,但这与说它实际上如回答者所描述的那样不同–我的意思是,这是有保证的501。–
Aaron Miller

6
@ BeniCherniavsky- Paskin在4.3.4节中查看tools.ietf.org/html/rfc7231而不是草案版本,我看到“允许给定目标资源上的PUT的原始服务器必须向服务器发送400(错误请求)响应包含Content-Range标头字段(...)的PUT请求。RFC的作者当然只是人类,他们确实会犯错误,并且RFC确实在痛苦中发展,但显然Content-Range标头不是要用于请求中,也不是很有意义。
爱马仕(Hermes)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.