Android OkHttp + Retrofit 范围下载¶
更新日期: 2022-8-17
- 2022-8-17 更新格式
前面我们已经知道如何使用OkHttp+Retrofit下载文件。
下载文件时,可能会遇到一些意外情况,比如网络错误或是用户暂停了下载。 再次启动下载,如果又要从头开始,会白白浪费前面下载好的内容。
http范围请求¶
Range 是一个请求首部,告知服务器返回文件的哪一部分。
在一个 Range 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。
如果服务器返回的是范围响应,需要使用 206 Partial Content 状态码。
假如所请求的范围不合法,那么服务器会返回 416 Range Not Satisfiable 状态码,表示客户端错误。
服务器允许忽略Range首部,从而返回整个文件,状态码用200。
示例
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
发起请求时,一般Range的内容写成 bytes=0-100 这样的形式。 或者请求多个部分时,指定多个范围。
Content-Range 表示主体长度或者尺寸。
参考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Range
服务器需要支持range¶
在返回中,若能够找到 Content-Range,则表明服务器支持断点续传。 有些服务器还会返回 Accept-Ranges,输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
使用示例¶
参考 https://github.com/AnRFDev/android-Basic4/tree/master/appdowloadsample
使用OkHttp添加Range头部,告知服务器我们需要的文件数据范围。
定义的方法中要求传入 @Header("Range")
需要传入的Range字符串形如 bytes=200-1000
我们也可以在下载前,先去检查文件已下载的部分的大小,再决定Range范围。 续传时,写入本地文件注意选择流的append模式。
参考¶
OkHttp系列
- OkHttp入门
- OkHttp + Retrofit 使用示例
- OkHttp接收普通文本
- OkHttp + Retrofit 下载文件与进度监听
- OkHttp + Retrofit 取消请求的方法
- OkHttp + Retrofit 范围下载
- OkHttp Retrofit 上传文件
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~