Съхраняване на REST заявки с обслужващи работници за синхронизирането им

Мисля да прехвърля приложението си офлайн с помощта на обслужващи работници. Вече постигам задоволителни резултати с кеширане на ресурси, но също така трябва да проверя onfetch дали съм свързан с интернет, ако не - да запазя заявката и да я натисна onsync.

Разбирам, че бъдещият onsync ще помогне с това, но имам нужда - дори временно - решение за това.

Опитах се просто да съхранявам заявките в масив в рамките на worker, но не е постоянен - ​​не работи след рестартиране на компютъра (докато SW работи и обслужва офлайн съдържание).

Каква е добрата посока - да го съхраним по някакъв начин в кеша като файлове? Или използване на IndexedDB / SimpleDB (Достъп до indexedDB в ServiceWorker. Състезание)?


person Karol Klepacki    schedule 24.04.2015    source източник
comment
Не е много ясно какъв ти е проблемът. Ако въпросът ви е дали IndexedDB може да се използва за офлайн съхранение, тогава да, може. Ако не знаете как да извършвате операциите си за съхранение, така че да поддържат както онлайн, така и офлайн режими, тогава можете да видите какво предлагат тук: stackoverflow.com/questions/22342836/   -  person dekkard    schedule 24.04.2015
comment
Благодаря, но търся начин да съхранявам POST заявки в Service Worker, когато съм офлайн, за да ги синхронизирам, когато отида онлайн. Съхраняването им в IndexedDB може да е отговор, но IndexedDB не се поддържа от Cordova Plugin и това е единственият начин да използвате Service Workers сега на iOS.   -  person Karol Klepacki    schedule 28.04.2015


Отговори (1)


Има пример на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics за използване на service worker за откриване на неуспехи за определени типове заявки (в този случай Google Анализ пингва чрез HTTP GET) и подреждане на неуспехите с помощта на IndexedDB. Опашката се проверява всеки път, когато сервизният работник се стартира и ако заявката може да бъде успешно „повтаряна“ (тъй като мрежата вече е достъпна), тя се премахва от опашката. Въпреки че няма гаранции за това кога ще се стартира услугата (събитията за фоново синхронизиране ще помогнат за това в бъдеще), можете спокойно да предположите, че ако някой използва активно вашето уеб приложение, услугата ще се съживи.

Това може да се обобщи за други типове заявки, като HTTP POSTs, но има няколко неща, за които да помислите:

  • Уверете се, че вашите потребители знаят, че техният HTTP POST е на опашка и ще бъде възпроизведен отново. Тъй като HTTP POSTs обикновено променят състоянието от страна на сървъра, не искате да изненадате потребителите, когато нещо се промени в резултат на преиграна заявка, която е на X часа.
  • В зависимост от услугата, която извиквате, HTTP POSTs може да изисква валидна заглавка Authorization. Ако използвате OAuth 2 за оторизация, той може да използва токени за достъп, които имат ограничен живот. Валидният по-рано токен за оторизация може да е изтекъл до момента, в който повторите заявката.
  • IndexedDB е добър избор за поставяне на вашите заявки в опашка, тъй като предлага гъвкавост при съхраняване на произволни данни и би трябвало да е възможно, например, да съхранявате тялото на HTTP POST без много работа. Ако не можете да използвате IndexedDB (казвате, че не се поддържа чрез Cordova), тогава единствената друга опция, за която мога да се сетя, е да опитам да използвам кеш паметта API за създаване на нов кеш на "опашка", с неуспешни Requests като ключове и празни Response обекти като стойности. При стартиране на service worker можете да използвате метода keys() във вашия кеш "queue", за да получите списък с всички Requests и за всяко queuedRequest извикайте fetch(queuedRequest), за да го възпроизведете отново. Не съм опитвал този подход преди, но мисля, че трябва да работи.
person Jeff Posnick    schedule 28.04.2015
comment
Може ли някой да даде пример за това как да съхраните тялото на HTTP POST в IndexedDB и по-късно да го извлечете? - person alearg; 16.04.2017
comment
благодаря ти, Джеф, можеш ли да предоставиш кодов фрагмент за съхраняване на заявката за публикация със заглавка в IndexedDb и задействане на повикването, след като кандидатства онлайн - person Webber; 29.08.2018