当前位置: 首页 > 知识库问答 >
问题:

在React Native应用程序中使用ETag缓存JSON响应

范翰飞
2023-03-14

在React Native应用程序中实现以下场景的最佳方式是什么?

  1. 向服务器发出HTTP请求,获取JSON响应和ETag头
  2. 保存此JSON响应的方式即使在用户重新启动应用程序后也会持续
  3. 每当重复此HTTP请求时,发送If-None-Match头。
    1. 当您得到“未修改”响应时,请使用持久化缓存中的版本
    2. 当您得到“成功”响应(表示响应已更改)时,使持久化缓存无效,保存新响应

    React Native有现成的组件来做这些事情吗?如果不是,人们最常用的处理方式是什么?

共有3个答案

范峰
2023-03-14

好的,这是我当前的解决方案,尚未进行生产测试。会喜欢你的谷歌反馈。

我使用Axios,但如果你不这样做,你仍然会围绕你周围的任何包装器来实现这个 - 除非你使用原生获取!

import api from 'your api wrapper.js'
api.etags = new Set;
api.cache = new Set;
api.addRequestTransform(request => {
  const etag = api.etags.get(request.url);
   if (etag) {
     request.headers['HTTP_IF_NONE_MATCH'] = etag;
   }
})

// or whatever you use to wrap ur HTT
api.addResponseTransform(response =>{ 
if (
    response.status === 304 &&
    response.headers &&
    response.headers.etag &&
    api.cache.has(response.headers.etag)
  ) {
    console.log('%cOVERRIDING 304', 'color:red;font-size:22px;');
    response.status = 200;
    response.data = api.cache.get(response.headers.etag);
  } else if (response.ok && response.headers && response.headers.etag) {
    api.cache.set(response.headers.etag, response.data);
    api.etags.set(response.config.url, response.headers.etag);
  }
});

我们在这里做的是将响应结果保存到api.cache,并将etag保存到api.etag,然后我们每次都将etag与请求一起发送。

我们可以升级它以记住正确的状态代码,或者将etags保存到磁盘,杜诺。你怎么想:)?

张兴旺
2023-03-14

哦。已经一年多了。我想你知道这是一个响亮的“不”,对吗?您必须解析响应标头以获取ETag并将其存储在设备上(您没有使用浏览器),然后在从您选择的存储机制中检索之后将标头添加到后续请求中。

我刚刚发现了这个,因为我想看看是否有人在React中做过这个,更不用说React Native了,我什么也没看到。

小鬼,是时候卷起袖子发明这个东西了。。。

周玺
2023-03-14

React native的fetch() API遵循http缓存规范,它提供了这个特性。当您点击304时,将在缓存中找到200旧的响应并被重用。

详细信息:

https://github.com/heroku/react-refetch/issues/142

回答如下:https://stackoverflow.com/a/51905151

React Native的fetch API桥接iOS上的NSURLSession和Android上的okhttp3。这两个库都严格遵循HTTP缓存规范。缓存行为主要取决于HTTP响应中的Cache-Control和Expires头。每个库都有自己的配置,您可以进行调整,例如控制缓存大小或禁用缓存。

还有这个:如何使用NSURLSession来确定资源是否发生了变化?

NSURLSession通过NSURLCache提供的缓存是透明的,这意味着当您请求以前缓存的资源时,NSURLSsession将调用完成处理程序/委托,就像发生了200个响应一样。

如果缓存的响应已过期,则NSURLSession将向源服务器发送一个新html" target="_blank">请求,但将在缓存(虽然已过期)结果中使用Last Modified和Etag实体头,包括If Modified-Since和If None Match头;这种行为是内置的,除了启用缓存之外,您不必做任何事情。如果源服务器返回304(未修改),则NSURLSession会将其转换为应用程序的200响应(使其看起来像是您获取了资源的新副本,即使它仍然是从缓存中提供的)。

 类似资料:
  • 我有一个简单的用例,服务器为请求返回Etag,并将该Etag作为标头(即)添加到所有后续url请求。如果响应中有变化,服务器可以用响应,否则可以用响应。对于后者,重用缓存中的响应是有意义的。但是okhttp总是返回作为缓存响应。 我做了一些故障排除,okhttp在内部将响应写入磁盘,但是不会将其返回到。仔细研究类,有一些文档明确说明不会使用缓存: 编辑-更正,Okhttp正确地添加了etag标头。

  • 问题内容: 我使用一些GeoIP服务在页面上放置国家/地区标记,具体取决于国家/地区IP。我需要为网站上的所有页面缓存JSON响应。 将此代码放入: 是否可以将其缓存?-似乎不起作用。 或者使用HTML5 localStorage可能更好,但是我不确定该怎么做。 我也尝试了JSONCache插件,但是对我来说不起作用。 问题答案: 您可以这样使用localStorage: 演示 因此,在您的特定情

  • 我要和服务人员一起建立我的preactjs网站。 使用Sw precache插件 我只是查看它存储在缓存存储中的缓存项,我期望的条目都在那里,但它们有一个空响应。 我与服务人员检查了其他一些网站,并注意到他们的条目有“OK”的响应。 只是想知道是什么触发了缓存响应说“OK”而不是空白。 我发现的另一个例子是,有些人返回OK,其他人返回空白

  • 我在使用AFNetworking和ETag值实现缓存时遇到问题。我的服务器为每个请求返回Cache-Control和ETag头值。但如果我再次请求相同的资源,AFNetworking将不会添加ETag。我应该手动保存每个响应的etag并将其附加到下一个请求吗? 在应用程序委托中,我已经设置了缓存对象: 另外,我使用的是AFHTTPRequestSerializer的默认缓存策略。 有什么想法吗?问

  • 我希望有人能对我一直在研究但没有取得多大进展的一些事情有所帮助。 我想利用 NSURLCache 来返回我在 iOS 应用程序中进行的 API 调用的缓存响应。当设备联机时,如果缓存的响应足够新,我想返回它,否则从远程获取。当设备脱机时,我希望立即返回缓存的响应(如果有),无论其年龄如何。 我正在使用AFNetworking。我正在对我控制的服务器进行API调用。协议是HTTPS。响应头当前为。我

  • 主要内容:什么是应用程序缓存(Application Cache)?,浏览器支持,HTML5 Cache Manifest 实例,实例,Cache Manifest 基础,Manifest 文件,更新缓存,实例 - 完整的 Manifest 文件,关于应用程序缓存的说明使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。 注意:manifest 的技术已被 web 标准废弃,不再推荐使用此功能。 什么是应用程序缓存(Application Ca