Android OkHttp如何处理ETag

11
我正在尝试使用OkHttp实现Android离线缓存方法。流程如下:
  1. 我发送一个HTTP请求,请求头字段中的ETag为空字符串,请求头中包含if-none-catched,服务器返回适当的ETag。
  2. 然后我存储ETag并缓存响应。
  3. 下次发起相同服务调用时,我会获得相同的ETag并将其设置为HTTP请求头,如果ETag相同,则服务器将返回HTTP 304。
我的问题是如何存储和检索ETag?OkHttp默认会处理还是需要在SQLite中进行存储?我一直在Google上寻找关于OkHttp实现ETag示例代码,但我得到的都是普通的缓存方法。我参考了以下链接:
  1. 我试图使用Java的HttpURLConnection进行“条件获取”,但我从未获得304状态码
  2. https://github.com/square/okhttp/wiki/Interceptors
  3. 正确设置Android中OkHttp缓存的方法
  4. https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45
到目前为止,我只能在第一次服务调用时进行缓存,但无法再从服务器获取最新数据。如果有人能够提供一些指导或发现任何处理ETag和if-none-catch的OkHttp动态示例以分享,将不胜感激。如有任何需要解释的地方,请随时提出。
1个回答

11

1
你的服务器是否发送ETags?缓存将在后续请求相同URL时使用它们。 - Jesse Wilson
1
OkHttp支持ETags的一个缺点是,它从不“刷新”缓存的过期时间。因此,一旦过期,除非更新,否则它将永远不会使用缓存。这只会在资源已更新(ETags不同且返回200响应而不是304)时发生。这意味着,只要继续获得304响应,OkHttp客户端将继续为每个后续请求访问网络。HTTP规范对客户端如何处理此场景模糊不清,因此我认为这不是一个错误。但如果我不断地访问网络,那就会失去缓存的目的。 - Steven Pena
1
我们有一个测试表明OkHttp至少部分支持这种行为。@StevenPena,你能否展示一个类似的测试来证明你所看到的行为? https://github.com/square/okhttp/blob/master/okhttp-tests/src/test/java/okhttp3/CacheTest.java#L1825 - Jesse Wilson
1
那个测试是我希望发生的事情。不幸的是,在Android中它不起作用。我将使用AndroidJUnit测试运行器设置一个测试项目并分享它。 - Steven Pena
@JesseWilson,如果您能抽出时间在维基页面的响应缓存部分提及ETag的使用,我将不胜感激。 - JJD
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接