我正在尝试使用客户端浏览器上的Ajax请求访问rss提要。
$.ajax({
type: 'GET',
url: 'http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk',
crossDomain: true,
dataType: 'xml',
success: function(responseData, textStatus, jqXHR) {
console.log(responseData)
},
error: function (responseData, textStatus, errorThrown) {
alert('failed.');
}
});
这给了我' Access-Control-Allow-Origin'错误。
我已经安装了cors包,所以它应该在我的服务器上启用,我错过了什么?
server.js文件
var express = require('express');
var basicAuth = require('express-basic-auth')
var bodyParser = require('body-parser')
var cors = require('cors');
var app = express();
app.use(cors());
app.get('/', function (req, res) {
// res.send('Hello World');
res.sendFile(__dirname + '/views/index.html');
})
var routes = require('./routes');
app.use('/api', routes);
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("App listening at http://%s:%s", host, port)
})
编辑*完整错误 XMLHttpRequest无法加载http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost:8081'因此不允许访问。
答案 0 :(得分:3)
由于http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk
未发送Access-Control-Allow-Origin
响应标头,因此您需要通过代理发出请求。通过在您的前端JavaScript代码中更改url
的值来实现这一点:
url: 'https://cors-anywhere.herokuapp.com/http://feeds.bbci.co.uk/news/business/rss.xml?edition=uk',
https://cors-anywhere.herokuapp.com/http://feeds.bbci.co.uk/…
网址会导致请求转到https://cors-anywhere.herokuapp.com
,这是一个开放/公共CORS代理,然后将请求发送到您实际要申请的http://feeds.bbci.co.uk/…
网址。< / p>
当该代理获得响应时,它会接受并向其添加Access-Control-Allow-Origin
响应标头,然后将其作为响应传递回您的请求前端代码。
带有Access-Control-Allow-Origin
响应标头的响应是浏览器看到的,因此浏览器显示的错误消息现在消失了,浏览器允许您的前端JavaScript代码访问响应。
或者使用https://github.com/Rob--W/cors-anywhere/之类的代码来设置您自己的代理。
您需要代理的原因是,因为http://feeds.bbci.co.uk/…
本身不发送Access-Control-Allow-Origin
响应标头,您的浏览器将拒绝让您的前端JavaScript代码访问来自该服务器的响应原点。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有更多详情。