通过 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 使用 NSURLSession
和 NSURLRequestUseProtocolCachePolicy
作为默认缓存策略。当进行网络调用时,服务返回的响应包含这些缓存控制标头:
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-age
和 must-revalidate
行为是正确的。在10
秒后将发出一个新请求。在10
秒内没有请求。
有什么线索吗?
【问题讨论】:
【参考方案1】:我做了一些测试,似乎在 ios(使用 NSURLSession)中,只要设置了must-revalidate
,max-age
就不会被考虑在内。对于可以同时使用这两个值的 Android,情况就不同了。
附:如果 HTTP 协议方面的专家对此主题有任何线索,请告诉我。
【讨论】:
以上是关于通过 React Native 使用 must-revalidate 和 NSURLSession的主要内容,如果未能解决你的问题,请参考以下文章
通过 Apollo 在 React Native 应用程序上使用 GraphQL 查询
路由器状态没有通过 redux 保持在 react-native
如何通过链接将视频直接分享到 facebook/instagram 作为可以使用 react-native 直接播放的视频
react-native-camera 在通过导航器打开 2 次时冻结应用程序