【问题标题】:Android OkHttp how to handle ETagAndroid OkHttp如何处理ETag
【发布时间】:2016-08-18 13:08:33
【问题描述】:

我正在尝试使用 OkHttp 做 Android 离线缓存方法。流程是这样的:

  1. 我向服务器发送了一个 HTTP 请求,其中包含标题字段 if-none-catched 的 ETag 空字符串,服务器返回一个正确的 ETag。
  2. 然后我存储 ETag 并缓存响应。
  3. 下次当我触发相同的服务调用时,我会得到相同的 ETag 并将其设置为 HTTP 请求标头,如果 ETag 相同,服务器将返回 HTTP 304。

我现在的问题是如何存储和检索 ETag? OkHttp 默认会处理还是我需要在 SQLite 中存储?我一直在谷歌上寻找 OkHttp 实现 ETag 示例代码,但我得到的只是普通的缓存方法。我参考的链接:

  1. I'm trying to use Java's HttpURLConnection to do a "conditional get", but I never get a 304 status code
  2. https://github.com/square/okhttp/wiki/Interceptors
  3. Correct way of setting up cache for OkHttp in Android
  4. https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45

到目前为止,我实现的只是第一次服务调用的缓存,但不再从服务器获取最新数据。感谢有人可以提供一些指导或找到任何动态处理 ETag 和 if-none-catch 的好例子供 OkHttp 分享。如有任何澄清,请随时询问。

【问题讨论】:

    标签: android okhttp etag if-none-match


    【解决方案1】:

    您只需要enable OkHttp’s response cache。如果您的网络服务器返回一个,它将使用 ETag。

    【讨论】:

    • 哪部分代码开启/开启okhttp响应缓存?我确实将缓存对象设置到我的 okhttpClient 中,但它并没有影响我的响应,我什至没有将 etag 作为标题返回
    • 您的服务器是否发送 ETag?缓存将在对同一 URL 的后续请求中使用它们。
    • OkHttp 支持 ETags 的一个缺点是 OkHttp 从不“刷新”缓存的过期时间。所以一旦过期,它就永远不会使用缓存,直到它被更新。这只会在资源已更新时发生(etag 不同并且返回 200 响应与 304)。这意味着 OkHttp 客户端将继续为每个后续请求访问网络,只要它继续获得304 响应。 HTTP 规范对客户端应如何处理这种情况含糊不清,所以我不认为这是一个错误。但如果我继续访问网络,它确实会破坏缓存的目的。
    • 我们有一个测试表明 OkHttp 至少部分支持这种行为。 @StevenPena 您能否展示一个类似的测试来证明您所看到的行为? github.com/square/okhttp/blob/master/okhttp-tests/src/test/java/…
    • 那个测试是我希望发生的。不幸的是,它在 Android 中无法以这种方式工作。我将使用 AndroidJUnit 测试运行程序建立一个测试项目并分享它。
    猜你喜欢
    • 2021-08-14
    • 2014-08-07
    • 2022-08-23
    • 2014-08-27
    • 2016-03-23
    • 2019-08-27
    • 2018-11-15
    • 2016-01-20
    相关资源
    最近更新 更多