详细讲解浏览器分段请求基础——Range,帮助你理解断点续传基础。

今天,这篇文章将告诉你如何只请求一部分资源。这里,我们需要使用几个http头——range,if-range,content-range和accept-range。
范围表头信息范围简介主要用于设置数据采集的范围,格式如下:
Range:=-Range:=-、-、-、-类型,一般为字节;范围的起始值通常是一个数字。如果不是数字,就看服务器逻辑怎么处理了。表示范围的结束值。该值是可选的。如果不存在,则意味着该范围延伸到文档的末尾。如果不是数字,同上。例如,获取0-10个字节的数据,15到数据的末尾。
Range : bytes=0-10,15-If-Range主要用于判断是否满足范围请求的条件。举个例子,假设你昨天用迅雷下载了一部电影,但是没有看完。今天,你又要重新下载了。再次下载时,客户端需要向服务器验证电影的资源内容是否发生了变化。If-range在这里用于验证。
Content-Range表示响应数据的内容范围,其语法格式如下:
content-range 3360-/content-range 3360-/* content-range 3360 */的类型,一般为字节;间隔的起始值;间隔的结束值;整个文件的大小(如果大小未知,则用“*”表示),例如:
Content-Range :字节S10-15/22 accept-ranges用于服务器响应以告知浏览器是否支持范围,
语法:
Accept-ranges : bytes Accept-ranges 3360 None None None不支持任何范围请求单元,所以很少使用,因为相当于不返回这个头。但有些浏览器如IE9会根据这个头禁用或取消下载管理器的暂停按钮;字节一般情况代码实现上面已经介绍了报头信息的概念。让我们用代码来实现它。一般流程如下:
图1
我们用中间件的方式来实现吧。
图2
如图2所示,我们通过range头获取请求的范围信息。如果类型是合法的,我们还需要以与url查询相同的方式处理范围数据。在处理过程中,我们需要纠正和过滤非法范围。如果类型是非法的,我们通常会返回整个内容。
范围内的重叠和相邻区域可以合并一次,例如:
Bytes=50-55,0-10,5-10,56-60,可以合并成[{start3360 0,end3360 10},{start3360 50,end3360 60}]。
图3
如图3所示,如果范围无效,我们将返回状态代码416,告诉客户端该范围无效,不符合要求。
图4
如图4所示,如果范围验证没问题,我们还需要将if-range提供的信息与etag或Last-Modified进行比较(两者选一)。
如果if-range没有值,可以认为是无条件的,返回true;如果有和etag一致的,证明资源没变,返回true,可以继续一些请求;如果给定的时间条件大于修改的时间,证明资源没有变化,可以继续一些请求(时间的意义可以自己确定);如果不满足if-range条件,继续按照正常返回资源的逻辑,如果满足,开始返回部分资源。
图5
如图5所示,状态被设置为206,这是http标识部分返回的状态。此外,还设置了接受范围和内容类型。这里我们使用stream对内容进行切片,这里只返回一定范围的内容。
对于多段请求,也可以通过以下方式实现:
图6
将content-type设置为multipart/byte ranges;Boundary=separator,所以你可以分段下载。
综上,本文主要介绍范围头的相关使用方法,内容还挺多的。本文的代码实现并不完整。主要讲的是原理和流程,有需要使用的朋友可以再打磨一下。

其他教程

暨南大学发展战略(暨南大学刘义强)

2022-8-28 21:25:21

其他教程

飙车 老司机(爱飙车的老司机)

2022-8-28 21:27:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索