我正在使用GitHub API请求需要最新的通知。问题是我的浏览器经常从浏览器缓存而不是从Internet加载我的请求的答案,这当然不是最新的。
为了防止这种情况并告诉浏览器不要使用缓存,我读到应该使用Cache-Control
标头。
问题是GitHub API的Cache-Control
中似乎没有Access-Control-Allow-Headers
头,因此不允许我在请求中使用Cache-Control
头。
那么,如果不允许我使用Cache-Control
标头,应该如何防止浏览器从缓存加载响应?为什么GitHub API首先禁止Cache-Control
标头,这有什么充分的理由?
仅提供更多上下文,我正在JavaScript中使用fetch API并尝试了以下代码
res = await fetch('https://api.github.com/notifications', {method: 'Get',
headers: {
'accept': 'application/vnd.github.v3+json',
'authorization': "token " + token,
'Cache-Control': 'no-cache'
}});
我收到错误消息:
可以从原始位置获取“ https://api.github.com/notifications”上的内容 “ http://127.0.0.1:5500”已被CORS政策阻止:请求 标头字段的缓存控制是不允许的 飞行前响应中的Access-Control-Allow-Header。
能否请您为我的问题推荐最佳解决方案?
答案 0 :(得分:0)
来自GitHub文档上的notifications page ...
通知已针对使用Last-Modified标头进行轮询进行了优化。如果没有新的通知,您将看到304 Not Modified响应,保持当前速率限制不变。有一个X-Poll-Interval标头,用于指定允许您轮询的频率(以秒为单位)。在服务器负载较高时,时间可能会增加。请遵守标题。
他们还使用curl提供了此示例...
# Add authentication to your requests
curl -I https://api.github.com/notifications
HTTP/1.1 200 OK
Last-Modified: Thu, 25 Oct 2012 15:16:27 GMT
X-Poll-Interval: 60
# Pass the Last-Modified header exactly
curl -I https://api.github.com/notifications
-H "If-Modified-Since: Thu, 25 Oct 2012 15:16:27 GMT"
HTTP/1.1 304 Not Modified
X-Poll-Interval: 60
他们正在使用Last-Modified
标头,其中包含通知的最新更新日期。您可以使用If-Modified-Since
标头将该日期回显到请求中的服务器,并且如果内容没有更改,您将得到一个“ 304 Not Modified”状态响应,其中不包含任何内容。
如文本所述,它们还提供了一个轮询间隔标题,您应该阅读该轮询间隔标题,并确保通知更新功能的运行频率不超过指定的间隔,在其示例中为“ 60”(秒),这意味着“每分钟不超过一次”。
关于另一个答案的注释-您绝对不应该使用缓存胸围查询参数。 GitHub提供了一种机制来控制缓存,并控制其服务器上的负载以保持可用性。忽视这一点会给每个人带来麻烦,并且可能违反他们的使用条款。
答案 1 :(得分:-1)
因此,我通过在请求中使用查询参数来解决了归因于0298注释的问题
let cachebust = window.localStorage.getItem("cachebust253");
if(cachebust === null) {cachebust = 0;}
res = await fetch('https://api.github.com/notifications?cache_bust=${cachebust}', {method: 'Get',
headers: {
'accept': 'application/vnd.github.v3+json',
'authorization': "token " + token,
}});
window.localStorage.setItem("cachebust253", parseInt(cachebust)+1);
edit:但这不是有效的解决方案,因为在github的情况下,它不遵守github api策略。正如dezfowler指出的那样,必须尊重github api的x-poll-interval标头