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

时间:2014-06-02 08:36:36

标签: android cache-control okhttp

我无法控制服务器,并且不断用Cache-Control: no-cache标头回复我。但我想迫使OkHttp缓存该响应,无论如何。

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

2 个答案:

答案 0 :(得分: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()将其添加为网络拦截器。

答案 1 :(得分:0)

您无法清除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