使用服务工作者存储 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 POST
s,但有几点需要考虑:
- 确保您的用户知道他们的 HTTP
POST
正在 queued 并将被重播。由于 HTTP POST
s 通常会修改 server-side 状态,因此您不希望因 X 小时前的重放请求而导致某些内容发生变化时让用户感到惊讶。
- 根据您调用的服务,HTTP
POST
s 可能需要有效的 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 Request
s as the keys and empty Response
objects as the values. At service worker startup, you could use the keys()
方法来获取所有 Requests
的列表,并且对于每个 queuedRequest
,调用fetch(queuedRequest)
重播。我以前没有尝试过这种方法,但我认为它应该有效。
我正在考虑使用服务工作者将我的应用程序离线。我已经通过缓存资源取得了令人满意的结果,但我还必须检查 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 POST
s,但有几点需要考虑:
- 确保您的用户知道他们的 HTTP
POST
正在 queued 并将被重播。由于 HTTPPOST
s 通常会修改 server-side 状态,因此您不希望因 X 小时前的重放请求而导致某些内容发生变化时让用户感到惊讶。 - 根据您调用的服务,HTTP
POST
s 可能需要有效的Authorization
header。如果您使用 OAuth 2 进行授权,它可能会使用生命周期有限的访问令牌。重放请求时,先前有效的授权令牌可能已过期。 IndexedDB
是 queue 请求的不错选择,因为它提供了存储任意数据的灵活性,并且应该可以存储 HTTPPOST
的 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 failedRequest
s as the keys and emptyResponse
objects as the values. At service worker startup, you could use thekeys()
方法来获取所有Requests
的列表,并且对于每个queuedRequest
,调用fetch(queuedRequest)
重播。我以前没有尝试过这种方法,但我认为它应该有效。