我知道这个问题在 Stack Overflow 上已经被讨论了很多次,但所有答案基本上都是“向服务器添加某个特定的标题”。 在这种情况下,API(Shopify)可以正常工作,并且可以轻松地通过curl进行访问。
我已经尝试过使用Axios库和Fetch API进行操作。
- 我已经尝试了Fetch选项中的每个referrer、mode和referrerPolicy的值。
- 我确认了我的BasicAuth凭据是正确的。
- 我已经在多个浏览器中尝试过了。
- 我已经从localhost、localhost.com(在我的/etc/hosts中设置了该值)以及具有真实域名的服务器中尝试过了。
我无法理解为什么这在cURL中完全正常工作,但在fetch()中却没有任何响应。
以下是我的代码缩短版本:
const apiKey = 'mykey';
const apiPassword = 'mypass';
const apibase = 'https://my-shop-domain.myshopify.com/admin/';
const endpoint = 'locations.json';
var headers = new Headers({
"Authorization": "Basic " + btoa( apiKey + ':' + apiPassword ),
});
fetch( apibase + endpoint {
method: 'GET',
headers: headers,
mode: 'no-cors',
// cache: "no-store",
// referrer: "client",
// referrerPolicy: "origin",
// credentials: 'include'
}).then( resp => resp.json().then( resp => {
console.log( resp );
})).catch( err => {
console.error(err);
});
返回的错误信息是:
由于CORS策略,源'https://localhost:8080'无法访问'https://my-shop-domain.myshopify.com/admin/locations.json'。预检请求的响应未能通过访问控制检查:所请求的资源上没有“Access-Control-Allow-Origin”头。如果不需要提取详细信息,您可以将请求模式设置为“no-cors”,以禁用CORS获取资源。
如果Shopify不包含 Access-Control-Allow-Origin 头,为什么cURL可以正常工作?有node和Ruby库可供访问Shopify API,因此很难相信它们完全不允许javascript访问。
所以我想问的是,我该如何在javascript中访问这个API?
-i
选项运行 curl,一切正常。我添加了 Origin 标头,如下所示:curl -i -X GET -H "Authorization:Basic abcde12345" 'https://my-store.myshopify.com/admin/locations.json' -H "Origin:localhost"
,它仍然正常工作。 - JakeParisAccess-Control-Allow-Origin
头部信息,cURL 以及其他服务器端软件(例如 NodeJS 或 Tomcat)并不会执行此类检查。 - skyboyergmail.com/account
,如果您已登录到gmail,则他们将看到您的帐户页面。CORS会阻止这种情况发生。(但我不明白的是,为什么浏览器不只是不发送带有CORS禁止请求的cookie。为什么要完全禁用整个请求?) - BallpointBen