2015-04-05 75 views
0

我試圖創建一個應用程序,將檢索股票名稱,詢問並從雅虎財經API購買價格,使用Restangular。當我執行GET請求時,我在創建的本地應用程序中訪問公共API時遇到問題。這與參數我送的網址:從本地域到公共API沒有'訪問控制允許來源'錯誤

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

使用郵差,這get請求返回包含股票名稱,開價買股票的價格的數組。在郵遞員做請求返回所需的信息沒有任何錯誤。

當我在我的地方這個要求,我得到以下錯誤:

的XMLHttpRequest無法加載http://finance.yahoo.com/d/quotes.csv?s=MSFT+GE&f=nab。請求的資源上沒有「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和郵差可以訪問它,我假設頭文件已經存在於API服務器中。爲什麼當我從本地請求時會出現此錯誤?

任何幫助,將不勝感激。

+0

Posstman想必添加必要的訪問控制,允許 - 原始標題。您必須在您的應用程序中執行相同的操作,否則瀏覽器會將您關閉。請在這裏輸入cors迷人的世界:http://www.html5rocks.com/en/tutorials/cors/#toc-cors-server-flowchart – Cerad 2015-04-06 01:10:31

+0

這是錯誤的。標題由API提供,而不是試圖請求它的人。郵差沒有問題,因爲它不符合瀏覽器的跨域策略,並且可以讓你查詢任何內容。 Chrome不會讓這個人提出請求,因爲它符合要求。 Chrome正在阻止該請求。正確的解決方案是使用JSONP或CORS。 – 2015-04-06 01:31:41

+0

所以我需要用CORS創建一個代理服務器才能使它工作。我曾經有過使用PHP做過這種事的經驗。有沒有其他的方法/例子,我可以配置Apache來處理這個或不使用PHP? – 2015-04-06 01:57:08

回答

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); 
    }) 
}); 
相關問題