You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp调用取消后能否读取响应体数据?拦截器场景相关问询

OkHttp请求取消后读取响应体及断点续传方案

请求被取消后能否读取响应体?

  • 不行。调用call.cancel()后,OkHttp会立即中断底层网络IO,释放相关资源,ResponseBody会被标记为已关闭。此时尝试读取响应体,会直接抛出IOException提示流已关闭,无法获取任何数据。

拦截器中取消后能否读取部分响应数据?

  • 应用拦截器:要么拦截器根本不会执行(请求在到达拦截器前已取消),要么取消操作会直接关闭响应流,读取已接收数据的可能性极低,基本无法实现。
  • 网络拦截器:由于更贴近底层网络层,如果取消时已有部分响应数据被缓存到OkHttp的内部缓冲区,有可能读取到这部分数据,但这完全依赖OkHttp的内部实现,不同版本行为可能不一致,而且无法保证能拿到完整的已传输字节,不建议依赖这种方式。

实现断点续传的可靠方案

如果目标是缓存已接收内容用于后续Range请求恢复下载,不要依赖取消后的读取逻辑,推荐这种更稳定的方式:

  1. 在网络拦截器中主动缓存数据:自定义包装ResponseBody,在读取响应体的同时,将字节写入本地缓存文件。
  2. 取消下载时终止读取:当需要取消下载,停止读取响应体即可,此时本地缓存文件已经保存了已接收的全部字节。
  3. 恢复下载时发起Range请求:检查服务器是否支持Range(响应头包含Accept-Ranges: bytes),然后在新请求中添加Range: bytes=已缓存字节数-的请求头,获取剩余部分数据后合并到缓存文件。

内容的提问来源于stack exchange,提问作者Roger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:20:36