如何缓存来自 Web 服务器的 okHTTP 响应?

2023-11-27

我想知道如何缓存来自Web服务器的okHTTP响应(返回json数据)?

我希望我的应用程序下载 RecycleView 所需的所有数据,并在用户第一次运行该应用程序时对其进行缓存 - 如果数据未更改,则避免从 Web 服务器重新下载和解析所有相同的数据。

我尝试获取响应标头,但这就是我得到的:

Request URL: https://somedomain.com/wp-json/?categories=3&per_page=100&status=publish
Request Method: GET
Status Code: 200 OK
Remote Address: 176.28.12.139:443
Referrer Policy: no-referrer-when-downgrade
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
Allow: GET
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json; charset=UTF-8
Date: Fri, 23 Mar 2018 15:41:23 GMT
Link: <https://somedomain.com/wp-json/>; rel="https://api.w.org/"
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: PleskLin
X-Powered-By: PHP/7.1.15
X-Robots-Tag: noindex
X-WP-Total: 43
X-WP-TotalPages: 1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: hr,en-US;q=0.9,en;q=0.8,de;q=0.7,nb;q=0.6
Connection: keep-alive
Host: somedomain.com
Referer: https://somedomain.com/somedir/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
categories: 3
per_page: 100
status: publish

我读过我可以找到ETAG 或上次修改时间从服务器响应中检查是否有任何更改,但正如您所看到的,没有这样的事情。

您是否知道如果应用程序仅需要在第一次运行时下载数据 - 之后仅当数据发生更改时该怎么办?


你需要这样的缓存拦截器:

public class CacheInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response response = chain.proceed(chain.request());

        CacheControl cacheControl = new CacheControl.Builder()
                .maxAge(15, TimeUnit.MINUTES) // 15 minutes cache
                .build();

        return response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                .header("Cache-Control", cacheControl.toString())
                .build();
    }
}

添加这个拦截器Cache给你的OkHttpClient像这样:

File httpCacheDirectory = new File(applicationContext.getCacheDir(), "http-cache");
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(httpCacheDirectory, cacheSize);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addNetworkInterceptor(new CacheInterceptor())
            .cache(cache)
            .build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何缓存来自 Web 服务器的 okHTTP 响应? 的相关文章

随机推荐

  • 低选择性色谱柱的索引和替代方案

    可用于在低选择性列上选择记录的策略范围有哪些 一个示例可能是订单表 多年来 您在其中建立了大量已完成的订单 但通常需要选择活动订单 订单可能会经历一个生命周期 例如下单 库存分配 从仓库挑选 发送给客户 开具发票和付款 订单还可能被取消 保
  • 自动化 GDB 调试会话的最佳方法是什么?

    GDB 是否有内置的脚本机制 我应该编写一个 Expect 脚本 还是有更好的解决方案 我每次都会发送相同的命令序列 并将每个命令的输出保存到一个文件中 很可能使用 GDB 的内置日志记录机制 除非有人有更好的主意 基本上 在这个例子中 我
  • SQL中什么时候需要给表名起别名?

    我注意到 在使用多个 JOIN 进行查询时 除非为其中一个表名指定一个别名 否则我的查询不起作用 这是一个简单的例子来解释这一点 This doesn t work SELECT subject from items join purcha
  • “替换不是一个函数”

    我正在尝试从数字中删除逗号 var thisbill str thisbill linebill z val if isNaN thisbill thisbill 0 00 thisbill str thisbill thisbill th
  • barh 在条之间产生不稳定的间距

    我一直在生成如下所示的条形图 请注意 由于某种原因 标签上的垂直间距不均匀 我不确定这是否与我分配刻度的方式或实际放置文本的任何机制有关 相关代码 height factor 40 0 ind np linspace 0 len sorte
  • 如何使覆盖控件高于所有其他控件?

    我需要使一个控件出现在所有其他控件之上 因此它将部分覆盖它们 如果您使用的是Canvas or Grid在您的布局中 将控件置于更高的位置ZIndex From MSDN
  • 为什么 JAX-WS 客户端在运行时访问 WSDL?

    使用 wsimport 生成 JAX WS 客户端后 wsimport keep WebService wsdl JAX WS 为何必须在运行时查找 wsdl 位置 这是一个错误吗 我发现了这篇很棒的帖子 JAX WS 客户端 访问本地 W
  • 整个一个核心专用于单个进程

    Linux 中是否有任何方法可以将一个 CPU 核心分配给特定的给定进程 并且该核心上不应调度任何其他进程或中断处理程序 我读过有关 Linux 中进程亲和力的内容使用任务集实用程序将进程绑定到 CPU但这并不能解决我的问题 因为它只是尝试
  • 我可以使用fetch来调用Notion API吗?

    我想使用 Notion 作为 SPA 的内容网关 我可以使用 fetch 中的 Notion API 吗 我正在尝试使用 fetch 来获取数据 但由于 CORS 而无法正常工作 let notion fetch import meta e
  • Microsoft Bot Framework - 机器人进入睡眠状态。有办法预防吗?

    我的基于机器人框架的机器人运行得很好 但是 当我在一段时间不活动 假设一天 后首次与机器人交互时 机器人似乎需要很长时间 大约 10 45 秒 才能发回其第一个回复 回复之后 回复时间又恢复得很好了 对我来说 后端服务似乎进入某种睡眠模式
  • 如何在不使用 setter 的情况下为类变量设置值

    我想插入一个值到Object变量而不使用设置器 如果可以的话怎么可能 这是一个例子 Class X String variableName getters and setters 现在我有一个函数 其中包含variable name the
  • FileProvider.getUriForFile 返回 NullPointerException

    我正在尝试编写我的第一个 Android 应用程序 其中涉及拍照并用它做一些事情 在查看了几个在线教程后 我整理了一些代码 但每当单击按钮时都会收到以下 NullPointerException 10 03 14 48 00 284 263
  • 如何在C89中获得SIZE_MAX

    我想得到SIZE MAX in C89 我想到了下面的方法来查找SIZE MAX const size t SIZE MAX 1 由于标准 6 2 1 2 ANSI C 规定 当有符号整数转换为相同或更大大小的无符号整数时 如果有符号整数的
  • 条件检查:if(x==0) 与 if(!x)

    有什么区别if x 0 vs if x 或者它们总是等价的 对于不同的 C 内置类型x bool int char pointer iostream 假设存在从类型到支持的类型的转换if x or if x 那么只要没有不同的转换opera
  • 有没有办法在 Spring Webflux 和 Spring Data React 中实现分页

    我试图理解 spring 5 的反应部分 我创建了简单的休息端点来使用 spring 查找所有实体web flux和 spring data reactive mongo 但没有看到任何如何实现分页的方法 这是我在 Kotlin 中的简单示
  • Hibernate:无法访问 TransactionManager 或 UserTransaction 来进行物理事务委托

    我使用 Servlet PostgreSQL 和 Hibernate 以及 EntityManager 来构建 Web 应用程序 一切正常 直到我将项目移动到基于 Maven 的项目 现在 每次我尝试从 EntityManagerFacto
  • 如何将sql DATE映射到LocalDate

    我想存储一个LocalDate in a DATE列并按原样检索它 两个都DATE and LocalDate根据定义 它们是 本地 类型 因此 概念timezone不应以任何方式干涉 下面的代码是一个最小的示例 它创建一个带有DATE内存
  • 生成随机唯一数字的性能问题

    我遇到一种情况 我需要创建数以万计的唯一数字 但是这些数字必须是 9 位数字并且不能包含任何 0 我当前的方法是生成 9 个数字 1 9 并将它们连接在一起 如果该数字尚未在列表中 则将其添加到列表中 例如 public void gene
  • 使用 Unity IoC 注册和解析 SignalR 集线器

    我想我错过了一些非常简单的东西 也许只是需要一双新的眼睛 我有一个 ASP NET MVC 应用程序 在该应用程序中 我使用 Unity 作为 IoC 来处理依赖项注入 我的每个存储库都需要注入一个数据库工厂 并且每个数据库工厂都需要注入一
  • 如何缓存来自 Web 服务器的 okHTTP 响应?

    我想知道如何缓存来自Web服务器的okHTTP响应 返回json数据 我希望我的应用程序下载 RecycleView 所需的所有数据 并在用户第一次运行该应用程序时对其进行缓存 如果数据未更改 则避免从 Web 服务器重新下载和解析所有相同