HTTP 范围请求
HTTP Range 请求要求服务器将资源的某些部分发送给客户端。范围请求对于各种客户端都很有用,包括支持随机访问的媒体播放器、只需要大型文件一部分的数据工具以及允许用户暂停和恢复下载的下载管理器。
检查服务器是否支持部分请求
如果 HTTP 响应包含 Accept-Ranges 头,并且其值不是 none,则服务器支持范围请求。如果响应省略了 Accept-Ranges 头,则表示服务器不支持部分请求。如果不支持范围请求,应用程序可以适应这种情况;例如,下载管理器可以禁用依赖范围请求来恢复下载的暂停按钮。
要检查服务器是否支持范围请求,您可以发出一个 HEAD 请求来检查头信息,而无需请求整个资源。如果您使用 curl,可以使用 -I 标志来发出 HEAD 请求。
curl -I https://i.imgur.com/z4d4kWk.jpg
这将生成以下 HTTP 请求
HEAD /z4d4kWk.jpg HTTP/2
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
响应只包含头信息,不包含响应体
HTTP/2 200
content-type: image/jpeg
last-modified: Thu, 02 Feb 2017 11:15:53 GMT
…
accept-ranges: bytes
content-length: 146515
在此响应中,Accept-Ranges: bytes 表示“bytes”可以用作定义范围的单位(目前没有其他单位可用)。Content-Length 头也很有用,因为它指示了如果您使用 GET 方法发出相同请求时图像的总大小。
从服务器请求特定范围
如果服务器支持范围请求,您可以通过在 HTTP 请求中包含 Range 头来指定您希望服务器返回文档的哪一部分(或多部分)。
单部分范围
我们可以使用 curl 演示从资源请求单个范围。-H 选项会将一个头行添加到请求中,此处为请求前 1024 字节的 Range 头。最后一个选项是 --output -,它将允许将二进制输出打印到终端。
curl https://i.imgur.com/z4d4kWk.jpg -i -H "Range: bytes=0-1023" --output -
发出的请求如下所示
GET /z4d4kWk.jpg HTTP/2
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
Range: bytes=0-1023
服务器以 206 Partial Content 状态响应
HTTP/2 206
content-type: image/jpeg
content-length: 1024
content-range: bytes 0-1023/146515
…
(binary content)
Content-Length 头指示所请求范围的大小,而不是图像的完整大小。Content-Range 响应头指示此部分消息在完整资源中的位置。
多部分范围
Range 头还允许您在多部分文档中一次获取多个范围。范围之间用逗号分隔。
curl http://www.example.com -i -H "Range: bytes=0-50, 100-150"
服务器以 206 Partial Content 状态响应,如下所示。响应包含一个 Content-Type 头,指示其后是一个多部分字节范围。边界字符串(本例中为 3d6b6a416f9b5)分隔主体部分,每个部分都有自己的 Content-Type 和 Content-Range 字段。
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 282
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 0-50/1270
<!doctype html>
<html lang="en-US">
<head>
<title>Example Do
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-150/1270
eta http-equiv="Content-type" content="text/html; c
--3d6b6a416f9b5--
条件范围请求
当恢复请求资源的更多部分时,您需要保证自上次接收到片段以来,存储的资源未被修改。
If-Range HTTP 请求头使范围请求成为条件请求:如果条件满足,将发出范围请求,服务器将返回带有相应主体的 206 Partial Content 响应。如果条件不满足,则返回完整的资源,状态为 200 OK。此头可以与 Last-Modified 验证器一起使用,或与 ETag 一起使用,但不能同时使用两者。
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
部分请求响应
使用范围请求时,有三个相关的状态
与分块 Transfer-Encoding 的比较
Transfer-Encoding 头允许分块编码,这在向客户端发送大量数据且在请求完全处理之前不知道响应总大小时非常有用。服务器会立即将数据发送给客户端,而无需缓冲响应或确定确切长度,从而提高了延迟。范围请求和分块兼容,可以相互独立使用,也可以结合使用。
另见
- 相关状态码:
200、206、416。 - 相关头:
Accept-Ranges、Range、Content-Range、If-Range、Transfer-Encoding。