0

我有一个简单的用例,其中服务器为请求返回Etag,并且该 etag 作为标头(即If-None-Match)添加到所有后续 url 请求中。如果响应有变化,服务器可以用 a200响应或以304其他方式响应。对于后者,重用来自缓存的响应是有意义的。但是 okhttp 总是null作为缓存的响应返回。

我进行了一些故障排除,并且响应由 okhttp 在内部写入磁盘,但CachingStrategy不会将其返回到CacheInterceptor. 仔细查看CachingStrategy该类,有文档专门说明不会使用缓存:

 /**
     * 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
  }

有没有办法解决这种行为并使用缓存的响应?

(我已启用缓存,如此处所述并且我使用的是 okhttp 版本3.10.0

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

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

与这些问题有些相关:

4

1 回答 1

1

要么你自己做缓存,要么让 OkHttp 的缓存做缓存。当您添加自己的条件时,OkHttp 假定您想要完全控制缓存并且它不参与其中。

于 2019-08-21T11:18:15.757 回答