retrofit - 在 okhttp 中,我想处理 Last-Modified 和 ETags,但不缓存整个响应

标签 retrofit etag last-modified http-caching okhttp

我正在使用 okhttp 和 Retrofit 来调用 REST 服务。从该服务返回的数据存储在我的 Android 应用程序中的 sqlite 数据库中。

每当我调用 REST api 时,如果数据没有更改(由 ETag 或 Last-Modified header 确定),我希望 Retrofit 回调不执行任何操作(数据库中的数据没问题)。否则,我想从 REST 服务下载更新的 JSON 并更新数据库(通过回调的 onSuccess 方法)。

有关缓存响应的所有设置磁盘缓存的 okhttp 示例,我只需要缓存/存储每个请求的 Etag/上次修改时间(而不是整个响应)。

我应该通过传递给 okhttp 的自定义缓存实现来执行此操作,还是应该与 okhttp 或 Retrofit 一起使用更好的接口(interface)?

一旦我完成了实现设置,我是否只需要在 onFailure 回调中处理304“错误”而不执行任何操作?

最佳答案

要知道您是否收到 304 作为响应,您可以在 onResponse 回调中捕获它,如下所示:

if (response.raw().networkResponse().code() == 304){
    // Do what you want to do
}

至少,这是当您使用 Retrofit 2 和 okHttp 3 时的情况。不确定早期版本,但我想它会是一样的?在响应中设置断点时,您始终可以尝试查找 304 响应。

关于retrofit - 在 okhttp 中,我想处理 Last-Modified 和 ETags,但不缓存整个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949691/

相关文章:

php - 如何检查目录内容是否已用 PHP 更改?

java - 查找 H2 数据库表中的行何时被修改

java - com.google.gson.JsonSyntaxException : java. lang.IllegalStateException:预期为 BEGIN_OBJECT 但在第 1 行第 1 列路径 $

php - Safari 不发送 "If-Modified-Since"和 "If-None-Match" header

Python:使用 'CacheControl` 的 HTTP 缓存不起作用

emacs - 如何使用 etags 跳转到 C++ 函数的声明?

vbscript - Robocopy - 比较文件的修改日期?

java - 使用 RxJava 和 Retrofit 进行 N 个连续的 api 调用

java - 如何将 lambda 用于自定义 SingleObserver

java - 如何使用 RETROFIT 库发布原始 JSON 对象