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

从URL获取文件内容返回旧数据:缓存位置排查与禁用方法咨询

HTTP请求缓存问题解答

我通过以下代码从URL读取文本文件内容,原本运行完全正常:

response = await http.get('http://example.com/complex.txt');

if (response.statusCode == 200) {
  complex = (convert.json.decode(response.body)['data'] as List)
      .map((e) => Complexes.fromJson(e))
      .toList();

  for (var i in complex) {
    complexes.add(i);
  }
}

但修改该文本文件内容后,响应体仍返回旧内容,咨询两个问题:

  1. 该文本的缓存是发生在主机端还是应用端?
  2. 如何禁用该缓存?

问题1:缓存发生位置

缓存可能出现在三个环节:

  • 应用端(客户端):你使用的http库或系统网络层可能默认启用了本地缓存,存储了之前的请求结果。
  • 主机端(服务器):服务器配置了缓存策略(比如Cache-Control、Expires等响应头),允许客户端复用旧资源。
  • 中间节点:如果域名使用了CDN、反向代理等服务,这些中间节点也会缓存静态资源,导致返回旧内容。

问题2:禁用缓存的方法

客户端侧处理

在请求中添加缓存控制头,强制获取最新内容:

response = await http.get(
  Uri.parse('http://example.com/complex.txt'),
  headers: {
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache',
    'Expires': '0',
  },
);

或者给URL添加唯一随机参数(比如时间戳),让每次请求的URL不重复,绕过缓存:

final timestamp = DateTime.now().millisecondsSinceEpoch;
response = await http.get(Uri.parse('http://example.com/complex.txt?t=$timestamp'));

服务器侧处理

如果有权限修改服务器配置,调整静态资源的缓存响应头:

  • 设置Cache-Control: no-cache, no-store, must-revalidate,明确禁止客户端和中间节点缓存该资源。
  • 针对静态文件,也可以配置基于文件修改时间的缓存策略,当文件更新时自动让缓存失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:15:36