如何影响 OkHttp 缓存的使用?
How to influence OkHttp cache usage?
您可以向 OkHttpClient
添加缓存,它将根据各种 cache-related HTTP header 工作,例如 cache-control
:
val okHttpClient =
OkHttpClient.Builder().apply {
cache(Cache(File("http_cache"), 50 * 1024 * 1024))
}.build()
有一个资源,服务器(不受我控制)在响应中指定 cache-control: no-cache
。但我还是想缓存它,因为我知道在某些情况下这样做是安全的。
我想我可以拦截响应并相应地设置 headers:
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
允许缓存时禁用缓存 - 也不起作用。
编辑:
是正确的。 addNetworkInterceptor()
和 .header("Cache-Control", "public, max-age=1000")
有效,.header("cache-control", "max-age=1000")
也有效。
但是当 运行 我的实验时,我做了一些错误的假设。这是我后来发现的:
它需要是一个网络拦截器,但它确实有效。
尝试 .header("Cache-Control", "public, max-age=1000")
,它应该缓存 15 分钟。
见
您可以向 OkHttpClient
添加缓存,它将根据各种 cache-related HTTP header 工作,例如 cache-control
:
val okHttpClient =
OkHttpClient.Builder().apply {
cache(Cache(File("http_cache"), 50 * 1024 * 1024))
}.build()
有一个资源,服务器(不受我控制)在响应中指定 cache-control: no-cache
。但我还是想缓存它,因为我知道在某些情况下这样做是安全的。
我想我可以拦截响应并相应地设置 headers:
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
允许缓存时禁用缓存 - 也不起作用。
编辑:
addNetworkInterceptor()
和 .header("Cache-Control", "public, max-age=1000")
有效,.header("cache-control", "max-age=1000")
也有效。
但是当 运行 我的实验时,我做了一些错误的假设。这是我后来发现的:
它需要是一个网络拦截器,但它确实有效。
尝试 .header("Cache-Control", "public, max-age=1000")
,它应该缓存 15 分钟。
见