Я думаю о том, чтобы перевести свое приложение в автономный режим с помощью сервисных работников. Я уже достиг удовлетворительных результатов с помощью ресурсов кэширования, но мне также нужно проверить при выборке, подключен ли я к Интернету, если нет — сохранить запрос и отправить его синхронно.
Я понимаю, что будущая синхронизация поможет с этим, но мне нужно, хотя бы временное, решение для этого.
Я пытался просто хранить запросы в массиве внутри worker, но он не постоянный - не работает после перезагрузки компьютера (при этом ПО работает и обслуживает офлайн-контент).
Какое хорошее направление - как-то хранить его в кеше, как файлы? Или с помощью IndexedDB/SimpleDB (Доступ к indexedDB в ServiceWorker. Состояние гонки)?
Хранение запросов REST с сервис-воркерами для их синхронизации
Ответы (1)
Пример есть на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics использования сервисного работника для обнаружения сбоев для определенных типов запросов (в данном случае Google Analytics пингует через HTTP GET
) и постановки сбоев в очередь с помощью IndexedDB
. Очередь проверяется каждый раз, когда запускается сервис-воркер, и если запрос может быть успешно «воспроизведен» (поскольку сеть теперь доступна), он удаляется из очереди. Хотя нет никаких гарантий относительно того, когда запустится сервис-воркер (события фоновой синхронизации помогут с этим в будущем), вы можете с уверенностью предположить, что если кто-то активно использует ваше веб-приложение, сервис-воркер восстановится.
Это можно обобщить на другие типы запросов, такие как HTTP POST
s, но есть несколько вещей, о которых следует подумать:
- Убедитесь, что ваши пользователи знают, что их HTTP
POST
поставлен в очередь и будет воспроизведен. Поскольку HTTPPOST
s обычно изменяет состояние на стороне сервера, вы не хотите удивлять пользователей, когда что-то меняется в результате повторного запроса, которому X часов. - В зависимости от того, какую службу вы вызываете, для HTTP
POST
может потребоваться действительный заголовокAuthorization
. Если вы используете OAuth 2 для авторизации, он может использовать токены доступа с ограниченным сроком действия. Срок действия ранее действительного токена авторизации может истечь к моменту повторного воспроизведения запроса. IndexedDB
— хороший выбор для постановки ваших запросов в очередь, поскольку он обеспечивает гибкость при хранении произвольных данных, и должно быть возможно, например, сохранить тело HTTPPOST
без особых усилий. Если вы не можете использоватьIndexedDB
(вы говорите, что это не поддерживается с помощью Cordova), то единственный другой вариант, о котором я мог подумать, это попытаться использовать хранилище кэша API для создания нового кеша "очереди" с ошибочнымиRequest
s в качестве ключей и пустымиResponse
объектами в качестве значений. При запуске сервис-воркера вы можете использовать методkeys()
в кэше "queue", чтобы получить список всехRequests
, и для каждогоqueuedRequest
вызовитеfetch(queuedRequest)
, чтобы воспроизвести его. Я не пробовал этот подход раньше, но я думаю, что он должен работать.