4

私は解決策を見つけようとしてきましたが、これまでのところ何も見つかりませんでした。だから私は天候 API に角度​​を付けて HTTP 要求を実行しようとしていますが、私はこの応答を取得し続けます:

Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 

私がこれまでに試したこと:

  1. この行をアプリ構成に追加する

    $httpProvider.defaults.headers.common['X-Requested-With']; を削除します。

  2. 複数のバージョンのangularを試しましたが、すべて同じ結果になりました

  3. これを私の.htaccessに追加する

    ヘッダーに Access-Control-Allow-Origin "*" を追加

  4. PHP でヘッダーを追加する

  5. GET リクエスト用に別の URL を試す

    (異なる API でも同じ結果)

  6. Angular の代わりに jQuery HTTP リクエストを使用すると、同じ結果が得られます...

私のコード

       $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-Requested-With'];すると問題が解決します

私はここで完全に迷子になりました。どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

2

jsonp を使用できます。

$http.jsonp('https://api.forecast.io/forecast/myapikey/52.370216,4.895168' +'?callback=JSON_CALLBACK')...

リンク: AngularJs で Jsonp リクエストを作成する

于 2015-11-20T19:30:17.087 に答える
2

api.forecast.ioは に許可を与えていませんmydomain.com

リクエストで送信されるヘッダーを変更しても役に立ちません。によって送信された応答ヘッダーを変更してmydomain.comも役に立ちません。

Forecast.io が提供するJavaScript ライブラリは、プロキシを使用します。あなたもその方法をとる必要があります。

于 2013-10-19T17:26:48.597 に答える
0

ホルヘの考えは正しかった。$http.jasonp が最も簡単なルートです。

$q を使用して延期された promise を返す例を次に示します。

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;
}
于 2016-09-21T04:04:36.417 に答える