No' Access-Control-Allow-Origin'从本地域到公共API的错误

时间:2015-04-05 22:32:47

标签: angularjs cross-domain cors restangular

我试图使用Restangular创建一个应用程序来检索股票名称,从Yahoo Finance API查询和购买价格。我在访问我在执行GET请求时创建的本地应用程序中的公共API时遇到问题。这是我发送参数的网址:

http://finance.yahoo.com/d/quotes.csv?s=MSFT+GE&f=nab

使用Postman,此get请求返回一个数组,其中包含股票的名称,要价和买入价。在邮递员中执行请求会返回所需信息,而不会出现任何错误。

当我在本地执行此请求时,出现以下错误:

XMLHttpRequest无法加载http://finance.yahoo.com/d/quotes.csv?s=MSFT+GE&f=nab。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost'因此不允许访问。

HTML代码如下:

<html ng-app="app">
<head>
<title>Restangular</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="//code.angularjs.org/1.2.27/angular-resource.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="//cdn.rawgit.com/mgonto/restangular/master/dist/restangular.min.js"></script>
</head>
<body>
<div ng-controller="IndexCtrl" ng-cloak>
    <ul>
        <li ng-repeat="person in people">{{person.Name}}</li>
    </ul>
</div>

和JS:

var app = angular.module('app', ['restangular'])
        .config(function(RestangularProvider) {
            RestangularProvider.setBaseUrl('http://finance.yahoo.com/d');
        });

    app.controller('IndexCtrl', function($scope, Restangular) {
        $scope.people = Restangular.all('quotes.csv?s=MSFT+GE&f=nab').getList();
    });

我对此错误感到困惑,因为这是一个公共API而POSTMAN可以访问它,我假设标头已经存在于API服务器中。从本地请求时,为什么会出现此错误?

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

这是我发出JSONP请求失败的原因,因为它正在尝试接收CSV文件。我不认为restangular知道如何读取你正在尝试的CSV文件。我认为您需要做与现在相同的事情,但使用YQL API,因为我认为这不会起作用。

无论如何这里是代码:

http://plnkr.co/edit/GokYqzJ0dXw86C6AM2UP?p=preview

请求(通过但由于文件类型而失败):

app.controller('MainCtrl', function($scope, $http) {
  $scope.name = 'World';
  $http.jsonp('http://finance.yahoo.com/d/quotes.csv', {
    params: {
      callback: 'JSON_CALLBACK',
      s: 'MSFT GE',
      f: 'nab'
    }
  }).success(function(response) {
    console.log(response);
  }).catch(function(response) {
    console.log(response);
  })
});