【问题标题】:Can I somehow remove header from OkHttp response before it has cached?我可以在缓存之前以某种方式从 OkHttp 响应中删除标头吗?
【发布时间】:2014-07-22 07:49:31
【问题描述】:

我无法控制服务器,它不断地用Cache-Control: no-cache 标头响应我。但无论如何,我都想强制 OkHttp 缓存该响应。

我可以在缓存之前以某种方式从 OkHttp 响应中删除标头吗?

【问题讨论】:

    标签: android cache-control okhttp


    【解决方案1】:

    您无法清除 no-cache 标头,但您仍然可以通过条件 GET 获得一些缓存。

    来自 OkHttp 的 Cache-Control 文档:

    在回复中,该字段的名称“no-cache”具有误导性。它不会阻止我们缓存响应;这仅意味着我们必须在返回之前与源服务器验证响应。我们可以使用有条件的 GET 来做到这一点。

    no-cache 不会阻止存储响应!当 OkHttp 稍后尝试使用该缓存响应时,它将通过使用 If-Modified-Since 标头联系原始服务器来验证缓存响应是否仍然有效。如果服务器返回304 Not Modified,则从缓存中提供响应正文。

    您可以通过向请求标头添加 max-stale 来增加缓存命中的机会。这将导致它使用缓存来处理 365 天前过期的响应。

    Cache-Control: max-stale=31536000
    

    【讨论】:

    • 我不能为 304 调用服务器,因为在某些情况下,我会在“无互联网”情况下使用缓存响应。是的,我已经在缓存控制中为 max-stale 属性使用了 4 周的时间间隔。
    • 嗨,我该如何添加Headers("If-Modified-Since", value);我检查了你的 github 网站,但没有得到如何设置值,你能举个例子吗?谢谢!
    【解决方案2】:

    您确实可以重写响应的 Cache-Control 标头,从而允许 OkHttp 对其进行缓存。来自他们网站上的食谱 (https://github.com/square/okhttp/wiki/Interceptors)

    private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
        @Override public Response intercept(Interceptor.Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());
        return originalResponse.newBuilder()
            .header("Cache-Control", "max-age=60")
            .build();
      }
    };
    

    只需使用 client.addNetworkInterceptor() 将其添加为网络拦截器。

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2016-08-29
      • 2015-07-05
      • 2018-03-10
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多