【发布时间】:2017-11-04 23:46:43
【问题描述】:
我正在使用 React.js 制作一个天气应用程序,并且我想发出一个 CORS 请求以从天气地下网站获取数据。 我想要的是获得一个城市名称,使用自动完成 API 来查找城市并获取该城市的数据。
问题是,每次我给出一个城市名称(例如:德黑兰),xhr.onerror 事件处理程序都会运行并且我得到这个错误:
XMLHttpRequest cannot load http://autocomplete.wunderground.com/aq?query=tehran. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
这是我获取数据的代码:
var axios = require('axios');
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
xhr.open(method, url, true);
}
else if (typeof XDomainRequest != "undefined") {
xhr = new XDomainRequest();
xhr.open(method, url);
}
else {
xhr = null;
}
return xhr;
}
function makeCorsRequest(url) {
var autoCompleteText;
var xhr = createCORSRequest('GET', url);
if (!xhr) {
alert('CORS not supported');
return;
}
xhr.onload = function() {
var text = xhr.responseText;
autoCompleteText = text;
}
xhr.onerror = function() {
alert('Woops, there was an error making the request.');
}
xhr.send();
return autoCompleteText;
}
const WEATHER_UNDERGROUND_AUTOCOMPLETE = 'http://autocomplete.wunderground.com/aq?query=';
const WEATHER_UNDERGROUND_URL = 'http://api.wunderground.com/api/eda52d06d32d71e9/conditions/q/';
module.exports = {
getTemp: function(city) {
var encodedCity = encodeURIComponent(city);
var requestAutoComplete = `${WEATHER_UNDERGROUND_AUTOCOMPLETE}${encodedCity}`;
var autoCompleteText = makeCorsRequest(requestAutoComplete);
var foundCity = autoCompleteText.RESULTS[0].name.split(', ');
var requestUrl = `${WEATHER_UNDERGROUND_URL}${foundCity[1]}/${foundcity[0]}.json`;
return axios.get(requestUrl).then(function(res) {
return res.data.current_observation.temp_c;
}, function(err) {
throw new Error(res.data.error);
});
}
}
【问题讨论】:
-
你能试试 axios.get(requestAutoComplete) .then(function(response) { console.log(response); } .catch(function(error) { console.log(error); } );
-
我在发布这个问题之前已经这样做了,但没有成功。
-
你想分享屏幕吗?这样我可以更好地检查这个
-
您请求资源的服务器没有设置必要的
Access-Control-标头,除非有人修改后端,否则无法解决它,Access-Control-Allow-Origin只是其中之一跨域资源共享的标头 -
@user3408151 之所以有效,是因为您直接在地址栏中输入了地址,但这里 OP 使用的是 ajax,这是另一回事
标签: javascript ajax reactjs cors