我在考慮使用服務工作人員將我的應用程序脫機。我已經在緩存資源方面取得了令人滿意的結果,但我也必須檢查我是否連接到互聯網,如果沒有,請存儲請求並將其推入onync。
我明白,未來的onsync會對此有所幫助,但我需要 - 甚至是臨時解決方案。
我試過只是將請求存儲在worker中的一個數組中,但它不是持久的 - 在計算機重新啓動後(SW工作並提供脫機內容)不起作用。
什麼是好方向 - 以某種方式將其存儲在緩存文件中?或者使用IndexedDB/SimpleDB(Accessing indexedDB in ServiceWorker. Race condition)?向服務人員存儲REST請求以同步它們
6
A
回答
19
有在使用服務工人以檢測某些類型的請求的失敗(在此情況下,通過HTTP GET
谷歌分析坪),以及使用IndexedDB
排隊失敗的https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics一個例子。每次服務工作人員啓動時都會檢查隊列,並且如果請求可以成功「重播」(因爲網絡現在可用),它將從隊列中移除。儘管服務人員何時啓動(後臺同步事件將在未來有助於這一點)並不能保證,但您可以放心地假設,如果某人正在使用您的Web應用程序,服務人員將自行恢復。
這可以推廣到其他類型的請求,例如HTTP POST
S,但也有考慮幾件事情:
- 確保用戶知道他們的HTTP
POST
正在排隊和意志重播。由於HTTPPOST
通常會修改服務器端狀態,因此如果由於X小時的重播請求而導致某些內容發生更改,則不希望用戶感到驚訝。 - 根據您要撥打的服務,HTTP
POST
可能需要有效的Authorization
標頭。如果您使用OAuth 2進行授權,則可能會使用壽命有限的訪問令牌。以前有效的授權令牌可能會在您重播請求時過期。 IndexedDB
是排隊請求的好選擇,因爲它提供了存儲任意數據的靈活性,並且應該可以在不需要太多工作的情況下存儲HTTPPOST
的主體。如果你不能使用IndexedDB
(你說它不支持使用Cordova),那麼我唯一能想到的其他選擇就是嘗試利用Cache Storage API創建一個新的「隊列」緩存,其中失敗的Request
s爲鍵和空Response
對象作爲值。在服務人員啓動時,您可以在「隊列」緩存中使用keys()
方法獲取所有Requests
的列表,並且對於每個,請撥打fetch(queuedRequest)
以重播它。我以前沒有嘗試過這種方法,但我認爲它應該可行。
+1
完美答案,謝謝傑夫! –
+0
任何人都可以提供一個如何將HTTP POST正文存儲到IndexedDB中並在以後檢索它的例子嗎? – alearg
相關問題
- 1. IIS同步服務請求?
- 2. 請求REST服務
- 3. SAP向HTTPS請求發送REST服務
- 4. 如何同步調用google方向API以請求服務器端的服務?
- 5. 向服務器重複異步請求
- 6. 工作人員的請求可以通過服務人員進行代理嗎?
- 7. Angular 2 Rest服務請求
- 8. REST Web服務POST請求
- 9. 同步Github存儲庫的私人存儲庫的拉取請求
- 10. 向Chrome同步服務發送HTTPS請求 - 獲取錯誤404
- 11. 服務人員正在對資源進行多次請求以緩存資源
- 12. 異步http請求服務
- 13. MonoDroid異步服務請求
- 14. 如何存儲Jboss Web服務請求
- 15. 如何使Jersey Rest POST請求同步
- 16. 存儲CURL請求時接收服務器是向下
- 17. 瞭解Gunicorn同步工作人員處理多個請求
- 18. 服務人員,雙緩存?
- 19. 如何緩存對象將它們存儲爲多個請求?
- 20. Python的Web服務器:如何以服務請求異步
- 21. 異步檢索REST服務中的信息,同時限制請求數
- 22. 服務器如何知道請求是同步還是異步?
- 23. 如何使用REST向S3存儲桶發送發佈請求?
- 24. 與離子2存儲服務同步訪問存儲
- 25. REST Web服務「錯誤的請求」
- 26. REST服務前的請求隊列
- 27. WCF REST服務400錯誤請求
- 28. WCF REST服務:請求對象爲空
- 29. REST請求服務器與jQuery
- 30. POST請求到REST服務在AsyncTask
這是不是很清楚你的問題。如果你的問題是IndexedDB是否可以用於離線存儲,那麼是的,它可以。如果您不知道如何執行存儲操作,以便它們支持在線和離線模式,那麼您可以在此處看到他們的建議:http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql服務器 – dekkard
謝謝,但我正在尋找一種方法來存儲POST請求內的服務工作者,當我離線爲了同步他們,當我將上線。將它們存儲在IndexedDB中可能是一個答案,但[Cordova Plugin](https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md)不支持IndexedDB,它是現在在iOS上使用服務人員的唯一方法。 –