减小
增大
默认
护眼
夜间
默认
HTTP Range:范围请求
在使用范围请求时,我们首先需要确定服务器是否支持范围请求。假如在响应中存在 Accept-Ranges 这一头部字段,而且它的值也不为“none”,那么则表示该服务器支持范围请求。如下例所示:
HTTP/1.1 200 OK
...
Accept-Ranges: bytes
Content-Length: 146515
Accept-Ranges: bytes表示使用 bytes 作为单位来为范围请求设定范围,Content-Length 则表示响应的完整大小。如果响应头中没有 Accept-Ranges 头,那么则说明服务器可能不支持范围请求。如下所示:
HTTP/1.1 200 OK
...
Accept-Ranges: none
Range: bytes=start-end
bytes 用来表示请求的范围,单位为字节,start 和 end 用来表示这个范围的起始位置。例如:- Range: bytes=20- :获取请求中第 20 个字节之后数据;
- Range: bytes= -50 :获取请求中最后 50 个字节的数据;
- Range: bytes=40-100 :获取请求中第 40 个字节到第 100 个字节之间的数据。
表示范围的两个数字中,如果缺少第一个数字,则表示这个范围从数据末尾开始计数;如果缺少第二个数字,则表示这个范围从给出的字节数到数据的末尾。
【示例】假如要从 c.biancheng.net 请求一张图片,但只返回前 1024 字节,客户端的请求如下所示:
GET /templets/new/images/logo.png HTTP/1.1
Host: c.biancheng.net
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://c.biancheng.net/golang/
Range: bytes=0-1023
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
Range 头中还可以列出多个范围,之间以逗号进行分隔,如下所示:
GET /golang/ HTTP/1.1
Host: c.biancheng.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://c.biancheng.net/sitemap/
Range: bytes=0-50, 100-150
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>
<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--
Content-Type:multipart/byteranges表示这个响应有多个 byterange。每一部分 byterange 都有他自己的 Centen-type 头和 Content-Range 头,并且使用 boundary 参数对响应体进行划分。与范围请求相关的有三种状态码:
- 若请求成功,服务器会返回 206 状态码;
- 若请求的范围越界(范围值超过了资源的大小),服务器会返回 416 状态码;
- 若服务器不支持范围请求,服务器会返回 200 状态码。