我无法控制服务器,并且不断用Cache-Control: no-cache
标头回复我。但我想迫使OkHttp缓存该响应,无论如何。
我可以在缓存之前以某种方式从OkHttp响应中删除标头吗?
答案 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