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

关于OkHttp中Cache-Control no-cache策略及stale-if-error支持的技术咨询

OkHttp缓存相关问题解答

1. 请求端no-cache处理策略

  • OkHttp中CacheControl.FORCE_NETWORK对应Cache-Control: no-cache,直接发起全量网络请求而非验证缓存,这是有意的设计决策。
  • 核心考量:早期设计时为简化缓存逻辑、降低维护复杂度,同时对齐部分传统HTTP客户端的行为,减少开发者迁移时的适配成本。
  • 省流量的替代方案:使用CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build(),生成Cache-Control: max-age=0请求头。此时OkHttp会自动带上If-None-Match/If-Modified-Since验证缓存,收到服务器304响应时复用缓存体,达到省流量的效果。

2. 无网络时复用缓存的Cache-Control指令

  • 关于stale-if-error(RFC5861):OkHttp官方目前没有明确的支持计划,但接受符合规范的社区PR,只要代码符合OkHttp的设计原则和质量要求。
  • 当前实现目标策略的方法:自定义Interceptor来实现逻辑:
    public class StaleIfErrorInterceptor implements Interceptor {
      @Override
      public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        // 先发起带缓存验证的请求(max-age=0)
        Request validateRequest = request.newBuilder()
            .cacheControl(new CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build())
            .build();
        try {
          return chain.proceed(validateRequest);
        } catch (IOException e) {
          // 网络不可用时,尝试读取缓存
          if (!isNetworkAvailable()) {
            Request cacheRequest = request.newBuilder()
                .cacheControl(CacheControl.FORCE_CACHE)
                .build();
            Response cacheResponse = chain.proceed(cacheRequest);
            if (cacheResponse != null) {
              return cacheResponse;
            }
          }
          throw e;
        }
      }
    
      private boolean isNetworkAvailable() {
        // 自行实现网络状态判断逻辑
        return false;
      }
    }
    
    注意:需自行实现网络状态判断逻辑,同时确保缓存响应未被明确禁止缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:45:55