使用服务工作者存储 REST 请求以同步它们

Storing REST requests with service workers to sync them

我正在考虑使用服务工作者将我的应用程序离线。我已经通过缓存资源取得了令人满意的结果,但我还必须检查 onfetch 我是否已连接到互联网,如果没有 - 存储请求,并将其同步推送。

我明白,未来的 onsync 会对此有所帮助,但我需要 - 甚至是临时的 - 解决方案。

我试过将请求存储在工作人员的数组中,但它不是持久的 - 在计算机重新启动后不起作用(而 SW 工作并提供离线内容)。

什么是好的方向 - 以某种方式将它像文件一样存储在缓存中?或者使用 IndexedDB / SimpleDB ()?

https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics 中有一个示例,使用服务工作者来检测某些类型请求的失败(在本例中,Google Analytics ping 通过 HTTP GET),并且queue 使用 IndexedDB 来弥补失败。 queue 每次 service worker 启动时都会检查,如果请求可以成功 "replayed"(因为网络现在可用),它就会从 queue 中删除。虽然无法保证 service worker 何时启动(后台同步事件将在未来提供帮助),但您可以放心地假设,如果有人正在积极使用您的 web 应用程序,则 service worker 将自行恢复。

这可以推广到其他类型的请求,例如 HTTP POSTs,但有几点需要考虑:

  • 确保您的用户知道他们的 HTTP POST 正在 queued 并将被重播。由于 HTTP POSTs 通常会修改 server-side 状态,因此您不希望因 X 小时前的重放请求而导致某些内容发生变化时让用户感到惊讶。
  • 根据您调用的服务,HTTP POSTs 可能需要有效的 Authorization header。如果您使用 OAuth 2 进行授权,它可能会使用生命周期有限的访问令牌。重放请求时,先前有效的授权令牌可能已过期。
  • IndexedDB 是 queue 请求的不错选择,因为它提供了存储任意数据的灵活性,并且应该可以存储 HTTP POST的 body 没有太多工作。如果您不能使用 IndexedDB(您说不支持在 "queue" 缓存上使用 Cordova), then the only other option I could think of would be to try to make use of the Cache Storage API to create a new "queue" cache, with failed Requests as the keys and empty Response objects as the values. At service worker startup, you could use the keys() 方法来获取所有 Requests 的列表,并且对于每个 queuedRequest,调用fetch(queuedRequest)重播。我以前没有尝试过这种方法,但我认为它应该有效。