Http请求头Range
用于请求服务器返回指定部分内容,常用由于断点续传。
请求格式
Range: <数据格式>=<数据开始的索引位置>-<数据结束的索引位置>
;
具体使用举例:
请求从0至500的byte数据:Range: bytes=0-500
请求第500个byte以后的全部数据:Range: bytes=501-
请求最后500个byte的数据:Range:bytes=-500
请求多个分段时,各分段以,分割:Range: bytes=0-100,101-200
判断服务端的支持
服务端是否支持Range
字段以及支持的数据格式,可以通过相应头中的Accept-Range
判断,格式为:
Accept-Ranges:<支持的格式>
;
如果相应头中没有返回Accept-Range
或者Accept-Range
后面的支持格式为none
,则表明服务不支持部分返回。
添加If-Range
请求头,将生成条件式范围请求。在服务端支持部分返回,则返回状态码206;否则返回200,并返回完整数据。
常见的响应码:
206:支持部分返回,将返回指定部分数据;
200:不支持部分返回,将从头开始完整返回数据;
416:请求数据范围不合法;
成功响应处理
成功响应后,响应头中将返回Content-Range
字段:Content-Range: <数据格式> <数据开始的索引位置>-<数据结束的索引位置>/<完整数据大小>
。
如果请求了多个分段数据,将返回多个Content-Range
。
需要注意此时的Content-Length
不是完成数据大小,而是传输数据大小。
与Transfer-Encoding分块传输的差别
Transfer-Encoding
在未完全知晓数据大小的情况即可分块发送数据,而使用Range
需要服务端在返回响应前就知道数据完整大小,因此Transfer-Encoding
的响应速度相应会更快一些。两者不冲突,可以一起使用。
2022-05-27