如何影响 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 分钟。