Я подумываю о том, чтобы использовать приложение в автономном режиме, используя сервис-работников. Я уже добился удовлетворительных результатов с помощью кеширования ресурсов, но мне также нужно проверить onfetch, подключен ли я к интернету, если нет - сохраните запрос и нажмите на него onsync.
Я понимаю, что будущий onsync поможет с этим, но мне нужно - даже временное - решение для этого.
Я попытался просто сохранить запросы в массиве внутри рабочего, но он не является постоянным - не работает после перезагрузки компьютера (в то время как SW работает и обслуживает автономный контент).
Какое хорошее направление - как-то хранить в кеше файлы? Или с помощью IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition)?Хранение запросов REST с сервисными работниками для их синхронизации
ответ
Там пример на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics использования работника службы для обнаружения отказов для определенных типов запросов (в данном случае Google Analytics пинги через HTTP GET
), и очередь неудачи с помощью IndexedDB
. Очередь проверяется каждый раз, когда рабочий сервис запускается, и если запрос может быть успешно «воспроизведен» (поскольку сеть теперь доступна), он удаляется из очереди. Хотя нет гарантий относительно того, когда начнет работать сервис-работник (события фоновой синхронизации помогут с этим в будущем), вы можете с уверенностью предположить, что если кто-то активно использует ваше веб-приложение, работник службы оживит себя.
Это можно обобщить и на другие типы запросов, как HTTP POST
с, но есть несколько вещей, чтобы думать:
- Убедитесь, что пользователи знают, что их HTTP
POST
ставится в очередь и будет переигрывать. Поскольку HTTPPOST
обычно изменяет состояние на стороне сервера, вы не хотите удивлять пользователей, когда что-то меняется в результате повторного запроса, который составляет X часов. - В зависимости от того, какую услугу вы вызываете, для HTTP
POST
s может потребоваться допустимый заголовокAuthorization
. Если вы используете OAuth 2 для авторизации, он может использовать токены доступа, которые имеют ограниченный срок службы. Раньше действующий токен авторизации мог быть истек к моменту повторного воспроизведения запроса. IndexedDB
- хороший выбор для очередности ваших запросов, поскольку он обеспечивает гибкость при хранении произвольных данных, и должно быть возможно, например, хранить тело HTTPPOST
без особых усилий. Если вы не можете использоватьIndexedDB
(вы говорите, что он не поддерживается с помощью Cordova), то единственным другим вариантом, о котором я мог подумать, было бы попытаться использовать Cache Storage API для создания нового кэша «очереди», с ошибкойRequest
s, ключи и пустыеResponse
объекты в качестве значений. При запуске сервисного персонала вы можете использовать методkeys()
в кеше «очередь», чтобы получить список всехRequests
, а для каждого позвонитеfetch(queuedRequest)
, чтобы воспроизвести его. Раньше я не пробовал этот подход, но я думаю, что он должен работать.
Отличный ответ, спасибо Джефф! –
Может ли кто-нибудь предоставить пример того, как сохранить тело HTTP POST в IndexedDB, а затем получить его? – alearg
- 1. Проблема с сервисными работниками в получении данных
- 2. Как управлять сервисными работниками в хроме?
- 3. Хранение, потоковое видео и обработка запросов с использованием API REST
- 4. Код для синхронизации iPhone с REST-серверами
- 5. Java Framework с сервисными зависимостями?
- 6. Попытка синхронизации запросов AJAX
- 7. Хранение pack.config и nuspec в синхронизации
- 8. RequireJS Singleton с веб-работниками
- 9. IOS App REST - лучшая практика для обработки запросов HTTP (синхронизации данных с сервером)
- 10. Тестирование контроллеров AngularJS с сервисными службами
- 11. jQuery рендеринг с веб-работниками
- 12. Git, repo и хранение вещей в синхронизации
- 13. Хранение таймера клиента в синхронизации - TCP
- 14. Мой код пронизан сервисными интерфейсами!
- 15. AFIncrementalStore для синхронизации данных ядра с REST API
- 16. Ах, так запутавшись с сервисными слоями
- 17. Spring Integration - Использование IntegrationManagementConfigurer с сервисными активаторами
- 18. Переменный доступ в пушких с несколькими работниками
- 19. Пакеты подписки и их хранение
- 20. Связь между работниками в uwsgi
- 21. VB.NET: хранение пространств имен классов в синхронизации с структурой папок
- 22. Связь между сервисными приложениями Fabric Applications
- 23. Аутентификация запросов REST-запросов REST в IE <10 невозможна?
- 24. Управление работниками для надежной очереди в Redis
- 25. Сомнения, связанные с изменчивыми, неизменяемыми объектами, и их использование для синхронизации синхронизации
- 26. Разделение запросов для запросов Web и REST в Spring MVC
- 27. GetRawBody() возвращается пустым для запросов REST
- 28. Подписание запросов REST для Android-приложения
- 29. Идентификатор столбца SharePoint для запросов REST
- 30. Хранение базы данных запросов API против memcached
Неясно, в чем проблема. Если ваш вопрос заключается в том, может ли IndexedDB использоваться для автономного хранилища, то да, он может. Если вы не знаете, как выполнять операции хранения, чтобы они поддерживали как онлайн, так и оффлайн режимы, вы можете увидеть, что они предложили здесь: http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard
Спасибо, но я ищу способ хранения POST-запросов в Service Worker, когда я в сети, чтобы синхронизировать их, когда я буду в режиме онлайн. Хранение их в IndexedDB может быть ответом, но IndexedDB не поддерживается [Кордовым плагином] (https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md), и это единственный способ использовать сервис-работников сейчас на iOS. –