我尝试对github进行API调用。此类API调用不需要身份验证。 该呼叫基本上基于普通的http | https NodeJS模块,但是在浏览器上通过browserify(因此它使用http-browserify或https-browersify)。
我的情况是在我正在制作的库中测试内部缓存。它在NodeJS环境上测试时效果很好,但在浏览器上没有。
概念是缓存目标URL的响应,然后对于后续调用相同的URL,它将首先检查此项是否在内部缓存中。如果是,那么它将从此类缓存项的响应标头字段中获取Etag
或Last-Modified
,以便在If-None-Match
或If-Modified-Since
的下一个请求标头中设置。如果来自新请求的响应返回304状态代码,那么我可以安全地从内部缓存返回缓存项。
在Chrome和Firefox上失败但在Safari上失败。
在Chrome上,我得到了
Fetch API无法加载http://api.github.com:443/orgs/angrybaozi/repos。预检的响应无效(重定向)
我做了一些研究,这样的错误主要是关于向HTTP发出请求,而不是HTTP。这导致了问题。注入请求标头的相关代码部分可以在https://github.com/haxpor/bfet/blob/master/src/core/core.js#L103-L111看到。这是提出请求的核心代码。只针对此案例的GET请求。
通过查看Chrome Developer Console发现的有趣部分是http | https NodeJS模块,它确实更改了目标HTTPs网址,如下所示。
从https://api.github.com/orgs/angrybaozi/repos
成为http://api.github.com:443/orgs/angrybaozi/repos
。看一下https NodeJS Module Docs,您会看到与此问题相关的hostname
和port
。我无法在网址中保留https://
。由模块来完成工作因此最终改变了一些东西。所以,我只想确认输入https://api.github.com/orgs/angrybaozi/repos
。
这可能是问题吗?我该如何解决?任何建议都会非常感激。
更新
我缩小了问题的范围。似乎每当我发送If-None-Match
或If-Modified-Since
的请求标头然后在Chrome上进行测试时,就会出现上述错误。
答案 0 :(得分:1)
查看https NodeJS模块文档,您会看到与问题相关的
hostname
和port
“
与此特定问题最相关的部分是protocol
。
默认为http:
,因此您的请求是针对HTTP URL的。因为它会自动重定向到HTTPS,所以它会在这里混淆跨域请求。
所以明确地将它设置为https:
,首先使请求成为HTTPS - 这样,API就不会重定向,一切都应该是o.k. CORS明智的。