Хранение запросов REST с сервис-воркерами для их синхронизации

Я думаю о том, чтобы перевести свое приложение в автономный режим с помощью сервисных работников. Я уже достиг удовлетворительных результатов с помощью ресурсов кэширования, но мне также нужно проверить при выборке, подключен ли я к Интернету, если нет — сохранить запрос и отправить его синхронно.

Я понимаю, что будущая синхронизация поможет с этим, но мне нужно, хотя бы временное, решение для этого.

Я пытался просто хранить запросы в массиве внутри worker, но он не постоянный - не работает после перезагрузки компьютера (при этом ПО работает и обслуживает офлайн-контент).

Какое хорошее направление - как-то хранить его в кеше, как файлы? Или с помощью 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, и теперь это единственный способ использовать Service Workers на iOS.   -  person Karol Klepacki    schedule 28.04.2015


Ответы (1)


Пример есть на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics использования сервисного работника для обнаружения сбоев для определенных типов запросов (в данном случае Google Analytics пингует через HTTP GET) и постановки сбоев в очередь с помощью IndexedDB. Очередь проверяется каждый раз, когда запускается сервис-воркер, и если запрос может быть успешно «воспроизведен» (поскольку сеть теперь доступна), он удаляется из очереди. Хотя нет никаких гарантий относительно того, когда запустится сервис-воркер (события фоновой синхронизации помогут с этим в будущем), вы можете с уверенностью предположить, что если кто-то активно использует ваше веб-приложение, сервис-воркер восстановится.

Это можно обобщить на другие типы запросов, такие как HTTP POSTs, но есть несколько вещей, о которых следует подумать:

  • Убедитесь, что ваши пользователи знают, что их HTTP POST поставлен в очередь и будет воспроизведен. Поскольку HTTP POSTs обычно изменяет состояние на стороне сервера, вы не хотите удивлять пользователей, когда что-то меняется в результате повторного запроса, которому X часов.
  • В зависимости от того, какую службу вы вызываете, для HTTP POST может потребоваться действительный заголовок Authorization. Если вы используете OAuth 2 для авторизации, он может использовать токены доступа с ограниченным сроком действия. Срок действия ранее действительного токена авторизации может истечь к моменту повторного воспроизведения запроса.
  • IndexedDB — хороший выбор для постановки ваших запросов в очередь, поскольку он обеспечивает гибкость при хранении произвольных данных, и должно быть возможно, например, сохранить тело HTTP POST без особых усилий. Если вы не можете использовать IndexedDB (вы говорите, что это не поддерживается с помощью Cordova), то единственный другой вариант, о котором я мог подумать, это попытаться использовать хранилище кэша API для создания нового кеша "очереди" с ошибочными Requests в качестве ключей и пустыми Response объектами в качестве значений. При запуске сервис-воркера вы можете использовать метод 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