我已经成功使用了Microsoft Academic Search API,但是由于某种原因,我未更改的代码大约在2周前停止工作,不知道为什么。我将其归结为一些CORS问题:飞行前OPTIONS
请求导致404,并使用POST
直接执行mode: 'no-cors'
阻止了自定义API密钥标头(Ocp-Apim-Subscription-Key
)的发送,结果为401。一切都还正常的时候,我从未在Networks开发选项卡中查看过,也许OPTIONS请求在两周后仍然有效吗?还是我这边的Firefox更新?
我尝试了GET和POST请求,我尝试了axios和fetch API,也尝试了无标准要求和标准要求。除了手动将API密钥添加到标头之外,什么都没有。
// simple no-cors request
fetch(
'https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate',
{
method: 'POST',
mode: 'no-cors', // I've tried removing this line for CORS request
headers: new Headers(
{ "Content-Type": "application/x-www-form-urlencoded", "Ocp-Apim-Subscription-Key":"[actual key not needed for replication]" }
),
body: "expr=Id%3D2101196984&attributes=Id"
}
).then( response => { console.log(response);} )
.catch(err => console.log(err))
查看Ocp-Apim-Subscription-Key
标头如何丢失。经过一些研究,我意识到这是由于no-cors
模式(see here)引起的。简单的POST标头:
Host: api.labs.cognitive.microsoft.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Origin: null
Content-Length: 34
DNT: 1
Connection: keep-alive
此请求导致401,权限被拒绝。注意我在示例中使用了一个虚拟密钥,但是我的真实密钥也遇到了同样的问题,这一定是由于省略了Ocp-Apim-Subscription-Key
,因为当我在手动添加密钥后重新发送请求时-header,响应就很好了]](使用Firefox的“开发人员工具栏网络中的“编辑并重新发送”功能=>“标题”标签,并手动添加了一行Ocp-Apim-Subscription-Key: [actual key]
)。
但是,当我使用CORS请求时,服务器无法真正处理以下OPTIONS预检请求,返回404。
在没有mode: 'no-cors'
的情况下发送与上述相同的提取请求时发生的Request OPTIONS标头>
Host: api.labs.cognitive.microsoft.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Access-Control-Request-Method: POST Access-Control-Request-Headers: ocp-apim-subscription-key Origin: null DNT: 1 Connection: keep-alive
响应标题:
HTTP/1.1 404 Resource Not Found Content-Length: 89 Content-Type: application/json Date: Mon, 28 Oct 2019 10:59:03 GMT
还有其他人遇到这个问题吗?我能做些什么,或者这似乎是微软方面的服务器问题?
我已经成功使用了Microsoft Academic Search API,但由于某种原因,大约两周前我未更改的代码停止工作,不知道为什么。我将其归结为一些CORS问题:飞行前...
我很高兴地说,CORS问题应该最终得到解决。问题本身是内部迁移期间配置错误的结果。
为延迟解决而致歉!