Cache-Control: no-cache
我无法控制服务器,它不断地用标题响应我。但无论如何,我都想强制 OkHttp 缓存该响应。
我可以在缓存之前以某种方式从 OkHttp 响应中删除标头吗?
Cache-Control: no-cache
我无法控制服务器,它不断地用标题响应我。但无论如何,我都想强制 OkHttp 缓存该响应。
我可以在缓存之前以某种方式从 OkHttp 响应中删除标头吗?
您确实可以重写响应的 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() 将其添加为网络拦截器。
您无法清除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