I tried to cache a POST request in a service worker on fetch event.
I used cache.put(event.request, response)
, but the returned promise was rejected with TypeError: Invalid request method POST.
.
When I tried to hit the same POST API, caches.match(event.request)
was giving me undefined.
But when I did the same for GET methods, it worked: caches.match(event.request)
for a GET request was giving me a response.
Can service workers cache POST requests? In case they can't, what approach can we use to make apps truly offline?
You can't cache POST requests using the Cache API. See https://w3c.github.io/ServiceWorker/#cache-put (point 4).
There's a related discussion in the spec repository: https://github.com/slightlyoff/ServiceWorker/issues/693
An interesting solution is the one presented in the ServiceWorker Cookbook: https://serviceworke.rs/request-deferrer.html Basically, the solution serializes requests to IndexedDB.