Angular服务工作者与POST请求

5

我使用Angular 5.2.7和Angular Service Worker 5.2.7。

我想要缓存webservices调用。因此,在我的ngsw-config.json文件中,为了dataGroups配置,我已经做了以下更改:

"dataGroups": [{
  "name": "tasks-users-api",
  "urls": ["/api", "/rest"],
  "cacheConfig": {
    "strategy": "freshness",
    "maxSize": 20000,
    "maxAge": "1h",
    "timeout": "5s"
  }
}]

我尝试缓存这两个URL: https://randomuser.me/api/?results=20 ---> 这个可以 https://test.moodlecloud.com/webservice/rest/server.php ---> 这个不行
第一个URL按预期缓存了。它是一个简单的GET服务。 第二个URL没有缓存。它是一个带有表单数据负载的POST服务。
您知道这是什么问题吗?

1
为什么会缓存POST请求呢?它们不是幂等的;如果您发出两个请求,您希望创建两个资源。缓存将完全破坏这一点。 - jonrsharpe
@jonrsharpe 这就是离线缓存的目的。这也是为什么他使用“新鲜度”策略,以便服务工作者尝试获取资源并在无法获取时回退。 - Ploppy
2
Ploppy是正确的,但jonrsharpe也有一点。我以前从未处理过POST请求SW缓存,并且从未考虑过它。现在,在一些良好方向的研究之后,似乎SW实现不允许存储POST请求:https://dev59.com/mVsW5IYBdhLWcg3wNE0q - fabienbranchel
大家好,通过拦截服务工作者中的fetch事件,可以读取POST请求。您可以按照自己的需求存储这些信息,但对我来说,indexedDB是一个简单的选择。请查看上述提到的stackoverflow问题,我今天发布了一个示例。 - Roman Gherta
1个回答

5

Service Worker API不允许POST/PUT请求。

在这篇博客文章中,展示了一个示例,说明如何使用IndexedDb(由Roman Gherta建议)来存储POST/PUT请求。

此解决方案也在Mozilla资源上提出建议。


对于任何对该主题感兴趣的人,这里有一个开放的问题/请求:https://github.com/w3c/ServiceWorker/issues/693 - fabienbranchel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接