一、简介
在做小程序的在线播放视频功能时,遇到了安卓端、模拟器都可以正常播放,IOS却无法正常播放的问题。
由于IOS的机制,所以必须使用分段下载进行处理才能正常播放视频。那么这里就记录HTTP协议中的Range和Content-Range是如何实现分段下载的。
二、参数说明
请求头
Range
:告知服务器,客户端下载文件想要从指定位置开始。Range的格式如下:
一般格式:
Range:(unit=first byte pos)-[last byte pos]
参数举例:
Range:bytes=0-500
表示下载从0到500字节的文件,即头500个字节 ,[0-500]前闭后闭。0<=range<=500
Range:bytes=501-1000
表示下载从500到1000这部分的文件,单位字节
Range:bytes=-500
表示下载最后的500个字节
Range:bytes=500-
表示下载从500开始到文件结束这部分的内容
Range:bytes=500-600,700-1000
表示下载这两个区间的内容
如果服务器能够正常响应的话,服务器会返回 206 Partial Content
的状态码及说明.
如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK
.(这个要注意,要分段下载时,要先判断这个,IOS请求时首先会发送不带Range的请求,先返回200和文件总大小,之后才会发送多次带Range的请求头进行分段下载)
响应头
Content-Range
: 表示,服务器响应了多少字节的数据,以及资源的总大小
一般格式:
//表示服务器响应了前(0-10)个字节的数据,该资源一共有(3103)个字节大小。
Content-Range: bytes 501-1000/2000
#501-1000 请求头里range的值
#2000 文件总大小
#bytes 字节方式
Content-Length
:表示这次服务器响应了多少字节的数据
一般格式:
Content-Length: 500
# 如上 501-1000 => 1000-501+1=500
Content-Type
:响应的资源类型,告知浏览器进行解析,类型略
Last-Modified
:表示资源最近修改时间,⚠️如果分段下载时,这个值修改了,可能就必须全部重新下载了
ETag
:只要实体发生改变,都会改变ETag
ETag: "3103-1435633968000"
// 或 弱ETag,前面带有 W/
ETag: W/"12342423"
注意,每种服务器对生成ETag的算法不同,这个要特别注意 如果使用分布式缓存,要特别要保证每台服务器生成的ETag算法是一致的.