HTTPQUERY
English

206 Partial Content

用法

206 Partial Content 状态码用于响应包含一个或多个 Range 请求头的请求。Range 请求头指定服务器返回文档的哪些部分,服务器可以选择以多段(multipart)文档的形式交付数据。

当指定单个 Range 请求头时,Content-Length 请求头反映所传输范围(即内容)的大小,Content-Type 请求头与文档类型匹配,Content-Range 请求头则指明所包含的区段。文档的完整大小出现在 Content-Range 请求头的 complete-length 字段中。所请求的数据随后位于消息体中。

对于多个范围,Content-Length 请求头表示消息体中的总字节数。初始的 Content-Type 请求头被设为 multipart/byteranges,随后的 Content-Type / Content-Range 成对字段描述每个范围。服务器不会在初始请求头中包含 Content-Range 字段。

在多范围请求中,服务器可以选择合并相互重叠的范围,或合并间隔小于发送一个额外分段开销的范围。这样做是出于效率考虑,因此收到的分段数少于请求数并不一定表示出错。反之则不成立:当只请求单个范围时,服务器不会生成多个分段。

除范围数量之外,分段的顺序同样不作保证。服务器会尽力按请求顺序发送范围,但这并非总是可行。

无论请求了多少个范围,Content-Range 请求头都会包含资源的总大小。当响应时大小未知,则以星号表示该值。

当服务器无法返回所请求的范围时,会返回 416 状态码。某些服务器则改为返回 200,并在消息体中包含整个文档。

单范围获取示例

客户端使用 Range 请求头请求视频文件中的一块数据。服务器返回所请求的范围,并标明这是 MP4 编码的视频。

请求

GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000

响应

HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/100000

<50,001 bytes of video data>

当总大小未知时的替代响应

HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*

<50,001 bytes of video data>

多范围获取示例

当请求多个范围时,客户端在请求中指定每个范围。各范围可以放在不同的行上,或在同一行内以逗号分隔。服务器使用一个字符串分隔符来标示各范围分段之间的边界。

请求

GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200

响应

HTTP/1.1 206 Partial Content
Content-Length: 1115
Content-Type: multipart/byteranges; boundary=range_sep

--range_sep
Content-Type: video/mp4
Content-Range: bytes 100-250/75000

<151 bytes of video data as the first range>

--range_sep
Content-Type: video/mp4
Content-Range: bytes 1500-2000/75000

<501 bytes of video data as the second range>

--range_sep
Content-Type: video/mp4
Content-Range: bytes 5000-5200/75000

<201 bytes of video data as the third range>

--range_sep--

可续传下载

206 Partial Content 响应使可续传下载成为可能。当传输被中断时,客户端会发送一个新请求,其 Range 请求头从最后收到的字节开始。服务器以 206 响应返回剩余数据,而非重新传输整个资源。下载管理器以及像 curl —continue-at - 这样的工具都依赖这一机制。

代码参考

.NET

HttpStatusCode.PartialContent

Rust

http::StatusCode::PARTIAL_CONTENT

Rails

:partial_content

Go

http.StatusPartialContent

Symfony

Response::HTTP_PARTIAL_CONTENT

Python3.5+

http.HTTPStatus.PARTIAL_CONTENT

Java

java.net.HttpURLConnection.HTTP_PARTIAL

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PARTIAL_CONTENT

Angular

@angular/common/http/HttpStatusCode.PartialContent