在Access-Control-Allow-Headers

时间:2019-07-24 20:42:45

标签: javascript http cors github-api fetch-api

我正在使用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。

能否请您为我的问题推荐最佳解决方案?

2 个答案:

答案 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标头