簡體   English   中英

與服務工作者一起存儲REST請求以同步它們

[英]Storing REST requests with service workers to sync them

我正在考慮使用服務工作人員使我的應用程序脫機。 我已經通過緩存資源獲得了令人滿意的結果,但我還必須檢查是否已連接到互聯網,如果沒有 - 存儲請求,並將其推送到同步。

我明白,未來的onsync將有助於此,但我需要 - 甚至是臨時的 - 解決方案。

我曾嘗試將請求存儲在worker中的數組中,但它不是持久的 - 在計算機重啟后不起作用(當SW工作並提供脫機內容時)。

什么是好方向 - 以某種方式將其存儲在緩存中? 或者使用IndexedDB / SimpleDB( 在ServiceWorker中訪問indexedDB。競爭條件 )?

https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics上有一個示例,它使用服務工作者來檢測某些類型請求的失敗(在這種情況下,Google Analytics ping)通過HTTP GET ),並使用IndexedDB排隊故障。 每次服務工作程序啟動時都會檢查隊列,如果請求可以成功“重放”(因為網絡現在可用),則會將其從隊列中刪除。 雖然無法保證服務工作者何時啟動(后台同步事件將來會對此有所幫助),但您可以放心地假設,如果有人正在積極使用您的Web應用程序,則服務工作人員將自行恢復。

這可以推廣到其他類型的請求,如HTTP POST ,但有幾點需要考慮:

  • 確保您的用戶知道他們的HTTP POST正在排隊並將被重播。 由於HTTP POST通常會修改服務器端狀態,因此當X重新設置的重放請求發生更改時,您不希望讓用戶感到驚訝。
  • 根據您正在調用的服務,HTTP POST可能需要有效的Authorization標頭。 如果您使用OAuth 2進行授權,則可能會使用生命周期有限的訪問令牌。 重播請求時,以前有效的授權令牌可能已過期。
  • IndexedDB是排隊請求的一個很好的選擇,因為它提供了存儲任意數據的靈活性,並且應該可以,例如,存儲HTTP POST的正文而不需要太多工作。 如果你不能使用IndexedDB (你說它不支持使用Cordova ),那么我能想到的唯一其他選擇是嘗試利用Cache Storage API創建一個新的“隊列”緩存,但Request失敗s作為鍵並將空的Response對象作為值。 在服務工作者啟動時,您可以使用“隊列”緩存中的keys()方法獲取所有Requests的列表,並且對於每個queuedRequest ,調用fetch(queuedRequest)來重放它。 我之前沒有嘗試過這種方法,但我認為它應該可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM