代码之家  ›  专栏  ›  技术社区  ›  dilix

仅使用缓存响应。无网络呼叫

  •  2
  • dilix  · 技术社区  · 6 年前

    有一个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 回复  |  直到 6 年前
        1
  •  1
  •   dilix    6 年前

    我的实现中的问题是,我继续原始请求并将头应用于响应(我的bad),需要修改初始请求,然后继续修改请求。 也像是 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())
        }