Javascript 访问控制允许Origin和Angular.js

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的多个版

我一直在试图找到一个解决办法,但到目前为止我发现什么都不管用。因此,我尝试使用angular对天气API执行HTTP请求,但我一直得到以下响应:

Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 
到目前为止我所尝试的:

  • 将此行添加到我的应用程序配置

    删除$httpProvider.defaults.headers.common['X-Requested-With']

  • 我试过angular的多个版本,都有相同的结果

  • 将此添加到我的.htacces

    标题添加访问控制允许源“*”

  • 使用PHP添加标题

  • 尝试获取请求的不同URL

    (即使不同的API,结果也一样)

  • 使用jQuery HTTP请求而不是Angular请求,同样的结果

  • 我的代码

           $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”-但这相当于一件事。