使用Etags时Okhttp不返回缓存的响应

时间:2019-08-21 05:11:32

标签: android okhttp okhttp3 etag if-none-match

我有一个简单的用例,其中服务器为请求返回 Etag ,并将该etag作为标头(即If-None-Match)添加到所有后续的url请求中。如果响应中有更改,则服务器可以使用200进行响应,否则可以使用304进行响应。对于后者,重用来自缓存的响应是有意义的。但是okhttp始终返回null作为缓存的响应。

我进行了一些故障排除,并且响应由okhttp内部写入磁盘,但是CachingStrategy并没有将其返回到CacheInterceptor。仔细研究CachingStrategy类,有documentation specifically声明将不使用缓存:

 /**
     * Returns true if the request contains conditions that save the server from sending a response
     * that the client has locally. When a request is enqueued with its own conditions, the built-in
     * response cache won't be used.
     */
    private fun hasConditions(request: Request): Boolean =
        request.header("If-Modified-Since") != null || request.header("If-None-Match") != null
  }

是否有解决此问题的方法,而改用缓存的响应?

(我已按照here所述启用缓存,并且我使用的是okhttp版本3.10.0

此外,奇怪的是,我不得不手动添加Etag。 Okhttp无法自行将etag添加到后续请求中。

编辑-更正后,Okhttp正确添加了etag标头。我需要使用网络拦截器而非常规拦截器,以查看etag标头被添加到后续请求中

与这些问题有关的一些事情

1 个答案:

答案 0 :(得分:1)

您可以自己进行缓存,也可以让OkHttp的缓存进行缓存。添加自己的条件时,OkHttp假定您要完全控制缓存,并且不参与。