【发布时间】:2021-12-30 12:58:57
【问题描述】:
您可以将缓存添加到 OkHttpClient,这将根据各种与缓存相关的 HTTP 标头(如 cache-control)工作:
val okHttpClient =
OkHttpClient.Builder().apply {
cache(Cache(File("http_cache"), 50 * 1024 * 1024))
}.build()
服务器(不受我控制)在响应中指定了cache-control: no-cache 的资源。但无论如何我都想缓存它,因为我知道在某些情况下这样做是安全的。
我想我可以拦截响应并相应地设置标题:
val okHttpClient =
OkHttpClient.Builder().apply {
cache(Cache(File("http_cache"), 50 * 1024 * 1024))
addInterceptor { chain ->
val response = chain.proceed(chain.request())
response
.newBuilder()
.header("cache-control", "max-age=1000") // Enable caching
.removeHeader("pragma") // Remove any headers that might conflict with caching
.removeHeader("expires") // ...
.removeHeader("x-cache") // ...
.build()
}
}.build()
很遗憾,这不起作用。显然,缓存决策是在拦截器拦截之前做出的。使用addNetworkInterceptor() 代替addInterceptor() 也不起作用。
相反 - 当服务器通过设置 cache-control: no-cache 允许缓存时禁用缓存 - 也不起作用。
编辑:
Yuri's answer 是正确的。 addNetworkInterceptor() 和 .header("Cache-Control", "public, max-age=1000") 有效,.header("cache-control", "max-age=1000") 也有效。
但是在进行实验时,我做了一些错误的假设。这是我后来发现的:
【问题讨论】:
标签: okhttp http-caching