通过 React Native 使用 must-revalidate 和 NSURLSession

Posted

技术标签:

【中文标题】通过 React Native 使用 must-revalidate 和 NSURLSession【英文标题】:Using must-revalidate with NSURLSession through React Native 【发布时间】:2016-09-29 07:32:46 【问题描述】:

在一个示例演示应用程序中,我使用 React Native 进行网络调用。在后台 React Native 使用 NSURLSessionNSURLRequestUseProtocolCachePolicy 作为默认缓存策略。当进行网络调用时,服务返回的响应包含这些缓存控制标头:

public, max-age=10, must-revalidate

我能注意到的是,如果 max-revalidate 存在,NSURLSession 不会遵守 10 秒。相反,如果在10 秒内进行新的网络调用时后者不存在,则返回缓存响应,否则进行新的调用。

根据14.9.4 Cache Revalidation and Reload Controls 部分,这不应该是预期的行为,但也许我错了。

因为缓存可能被配置为忽略服务器指定的 过期时间,并且因为客户端请求可能包含 max-stale 指令(具有类似的效果),该协议还包括一个 源服务器要求重新验证缓存的机制 进入任何后续使用。当 must-revalidate 指令是 存在于缓存接收到的响应中,该缓存不得使用 在响应后续请求时变得陈旧后的条目 无需先使用原始服务器重新验证它。 (即缓存 如果仅基于 源服务器的 Expires 或 max-age 值,缓存的响应是 陈旧的。)

我发现了一个关于这个主题的有用讨论:HTTP Cache Control max-age, must-revalidate。根据讨论,协议似乎有点

这里模棱两可,但在实践中我发现必须重新验证 意味着它必须重新验证而不管 max-age。

一个非常奇怪的事情是,如果我对 android 做同样的事情,同时使用 max-agemust-revalidate 行为是正确的。在10 秒后将发出一个新请求。在10 秒内没有请求。

有什么线索吗?

【问题讨论】:

【参考方案1】:

我做了一些测试,似乎在 ios(使用 NSURLSession)中,只要设置了must-revalidatemax-age 就不会被考虑在内。对于可以同时使用这两个值的 Android,情况就不同了。

附:如果 HTTP 协议方面的专家对此主题有任何线索,请告诉我。

【讨论】:

以上是关于通过 React Native 使用 must-revalidate 和 NSURLSession的主要内容,如果未能解决你的问题,请参考以下文章

通过 Apollo 在 React Native 应用程序上使用 GraphQL 查询

路由器状态没有通过 redux 保持在 react-native

如何通过链接将视频直接分享到 facebook/instagram 作为可以使用 react-native 直接播放的视频

react-native-camera 在通过导航器打开 2 次时冻结应用程序

无法通过 react-native-webview 访问相机

React Native 速成 002 — 使用 UI框架 React Native Elements