我有一个简单的用例,其中服务器为请求返回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 标头被添加到后续请求中
与这些问题有些相关: