3

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

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

4

2 回答 2

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() 将其添加为网络拦截器。

于 2016-08-27T20:29:15.700 回答
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
于 2014-06-02T14:14:25.060 回答