Javascript 访问控制允许Origin和Angular.js
我一直在试图找到一个解决办法,但到目前为止我发现什么都不管用。因此,我尝试使用angular对天气API执行HTTP请求,但我一直得到以下响应:Javascript 访问控制允许Origin和Angular.js,javascript,jquery,angularjs,http-headers,Javascript,Jquery,Angularjs,Http Headers,我一直在试图找到一个解决办法,但到目前为止我发现什么都不管用。因此,我尝试使用angular对天气API执行HTTP请求,但我一直得到以下响应: Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 到目前为止我所尝试的: 将此行添加到我的应用程序配置 删除$httpProvider.defaults.headers.common['X-Requested-With'] 我试过angular的多个版
Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.
到目前为止我所尝试的:
$http({
method: 'GET',
url: 'https://api.forecast.io/forecast/myapikey/52.370216,4.895168'
}).
success(function(response) {
console.log('succes');
console.log(response);
}).
error(function(response) {
console.log('failed');
console.log(response);
});
这些解决方案似乎都不起作用,我以前使用过Angular,通常添加
delete$httpProvider.defaults.headers.common['X-request-With']代码>将解决此问题
我在这里完全迷路了,非常感谢您的帮助,谢谢 api.forecast.io
未向mydomain.com
授予权限
更改请求中发送的头将没有帮助。更改mydomain.com
发送的响应头没有帮助
服务器使用代理。您也需要采取行动。您可以使用jsonp:
$http.jsonp('https://api.forecast.io/forecast/myapikey/52.370216,4.895168'+'?callback=JSON_callback')。。。
链接:乔治的想法是正确的$http.jasonp是最简单的路由
下面是一个使用$q返回延迟承诺的示例
function getForecast( lat, lon ){
var deferred = $q.defer();
var apiKey = 'my-actual-api-key-here';
var url = 'https://api.forecast.io/forecast/' + apiKey + '/' + lat + ',' + lon + '?callback=JSON_CALLBACK';
$http.jsonp( url )
.success( function forecastReceived( forecastData, status, headers, config ) {
deferred.resolve( forecastData );
} )
.error( function forecastFailed( errorData, status, headers, config ) {
deferred.reject( errorData );
} );
return deferred.promise;
}
或者您可以使用(正如我所做的)restangular,但您需要首先设置它:
function isDataGood( forecastData ){
var isGood = false;
// test data here
// isGood = true;
return isGood;
}
var apiKey = 'my-actual-api-key-here';
Restangular.setBaseUrl( 'https://api.forecast.io/' );
Restangular.setJsonp( true );
Restangular.setDefaultRequestParams( 'jsonp', { callback: 'JSON_CALLBACK' } );
var API = Restangular.one( 'forecast/' + apiKey );
function getForecast( lat, lon ){
var deferred = $q.defer();
function failed( error ){
// TODO : retry logic here
deferred.reject( error );
}
API
.one( lat + ',' + lon )
.get()
.then(
function forecastReceived( forecastData ) {
if( isDataGood( forecastData ) ){
deferred.resolve( forecastData );
} else {
failed( { msg : 'ERROR : received bad data' } );
}
},
function forecastFailed( error ) {
failed( error );
} );
return deferred.promise;
}
你试过使用jsonp吗?@subzero-他没有运行forecast.io,所以他不能让他们发送jsonp响应。@Quentin他们确实为jsonpHmm提供支持,我认为它不会被支持,因为他们的官方图书馆不使用它…但是,与该引用相关的警告不能掉以轻心。这是一个更好的答案-不需要服务器代理。注意:很多人使用“RestangularProvider”而不仅仅是“Restangular”-但这相当于一件事。