仅使用缓存的响应。没有网络通话

时间:2018-10-22 23:04:08

标签: android retrofit2 okhttp3 okhttp

有一个具有调用限制的API,在这种情况下,我想缓存响应,如果缓存仍然有效,则不运行网络响应。

首先我有cache interceptor

fun provideCacheInterceptor(): Interceptor = Interceptor { chain ->
        val response = chain.proceed(chain.request())
        val cacheControl = CacheControl.Builder()
                .maxAge(6, TimeUnit.HOURS)
                .maxStale(6, TimeUnit.HOURS)
                .onlyIfCached()
                .build()
        response.newBuilder()
                .header("CacheControl", cacheControl.toString())
                .build()
    }

我将缓存和拦截器附加到客户端

client = OkHttpClient().newBuilder()
                .cache(cache)
                .addInterceptor(loggingInterceptor)
                .addInterceptor(cacheInterceptor)

当我尝试检查是否来自缓存和/或来自网络的响应时,结果是我

Log.e("!@#", "cached: ${it.raw().cacheResponse()?.toString()}")
Log.e("!@#", "network: ${it.raw().networkResponse()?.toString()}")

我明白了

cached: Response{protocol=http/1.1, code=200, message=, url=https://API}
network: Response{protocol=h2, code=200, message=, url=https://API}

如果缓存仍然有效,有什么办法 不是 来调用网络端点?

1 个答案:

答案 0 :(得分:1)

在我的实现中,我继续原始请求并将标头应用于响应(我不好)的问题,需要修改初始请求然后继续进行修改后的请求。 也似乎像Cache-Control标头错字。

正确的缓存拦截器看起来像

fun provideCacheInterceptor(networkManager: NetworkManager): Interceptor = Interceptor { chain ->
        val request = chain.request()
        val cacheControl = CacheControl.Builder()
                .maxAge(6, TimeUnit.HOURS)
                .maxStale(6, TimeUnit.HOURS)
                .build()
        chain.proceed(request.newBuilder()
                .header("Cache-Control", cacheControl.toString())
                .build())
    }