使用HTML5 fetch API允许Access-Control-Allow-Origin标头

时间:2016-04-27 00:37:22

标签: html5 api url fetch

我正在使用HTML5 fetch API。

var request = new Request('https://davidwalsh.name/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, `j` is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

我能够使用普通的json但无法获取上述api url的数据。 它抛出错误:

  

Fetch API无法加载https://davidwalsh.name/demo/arsenal.json。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost'因此不允许访问。如果不透明的回复符合您的需求,请将请求的模式设置为“无人”状态。在禁用CORS的情况下获取资源。

7 个答案:

答案 0 :(得分:47)

像epascarello所说,托管资源的服务器需要启用CORS。你可以在客户端做什么(也可能是你想到的)设置获取CORS的模式(尽管这是我认为的默认设置):

fetch(request, {mode: 'cors'});

但是仍然要求服务器也启用CORS,并允许您的域请求资源。

查看CORS documentation,此awesome Udacity video解释Same Origin Policy

您也可以在客户端使用no-cors模式,但这只会给您一个不透明的响应(您无法读取正文,但响应仍然可以由服务工作者缓存或由某些API使用,如<img>):

fetch(request, {mode: 'no-cors'})
.then(function(response) {
  console.log(response); 
}).catch(function(error) {  
  console.log('Request failed', error)  
});

答案 1 :(得分:2)

这对我有用:

npm install -g local-cors-proxy
我们要请求的具有CORS问题的

API端点:

https://www.yourdomain.com/test/list

启动代理:

lcp --proxyUrl https://www.yourdomain.com

 Proxy Active 

 Proxy Url: http://www.yourdomain.com:28080
 Proxy Partial: proxy
 PORT: 8010

然后在您的客户端代码中,新的API端点:

http://localhost:8010/proxy/test/list

最终结果将是对https://www.yourdomain.ie/test/list的请求,而没有CORS问题!

答案 2 :(得分:1)

我的前端代码运行在http://localhost:3000中,而我的API(后端代码)运行在http://localhost:5000

使用提取API调用API。最初它是引发“ cros”错误。 然后在我的Backend API代码中添加以下代码,从而允许从任何地方进行源和标头。

let allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', "*");
  res.header('Access-Control-Allow-Headers', "*");
  next();
}
app.use(allowCrossDomain);

但是在其他环境(例如舞台,产品)的情况下,您应该限制自己的出身。

答案 3 :(得分:1)

我知道这是一篇较旧的文章,但是我发现解决该错误的方法是使用服务器的IP地址,而不是在获取请求中使用域名。 例如:

#(original) var request = new Request('https://davidwalsh.name/demo/arsenal.json');
#use IP instead
var request = new Request('https://0.0.0.0/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, `j` is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

答案 4 :(得分:1)

您需要在请求数据的服务器端设置cors标头。 例如,如果您的后端服务器在Ruby on Rails中,请在发送回响应之前使用以下代码。应该为任何后端服务器设置相同的标头。

headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
headers['Access-Control-Request-Method'] = '*'
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'

答案 5 :(得分:0)

如果您使用的是nginx,请尝试

#Control-Allow-Origin access

    # Authorization headers aren't passed in CORS preflight (OPTIONS) calls. Always return a 200 for options.
    add_header Access-Control-Allow-Credentials "true" always;
    add_header Access-Control-Allow-Origin "https://URL-WHERE-ORIGIN-FROM-HERE " always;
    add_header Access-Control-Allow-Methods "GET,OPTIONS" always;
    add_header Access-Control-Allow-Headers "x-csrf-token,authorization,content-type,accept,origin,x-requested-with,access-control-allow-origin" always;

    if ($request_method = OPTIONS ) {
        return 200;
    }

答案 6 :(得分:-3)

https://expressjs.com/en/resources/middleware/cors.html 您必须使用cors。

安装:

$ npm install cors
const cors = require('cors');
app.use(cors());

您必须将此代码放在节点服务器中。