2016-05-17 72 views
-1

我正在使用角js $ http服務的雅虎獲取請求到雅虎財務休息api但是我得到http狀態碼405作爲迴應。

下面是完整的堆棧跟蹤。

index.html#/tab/stock:1 XMLHttpRequest cannot load http://finance.yahoo.com/webservice/v1/symbols/SUZLON.NS/quote?format=json&view=detail. 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' 
header is present on the requested resource. 
Origin 'http://localhost:8080' is therefore not allowed access. 
The response had HTTP status code 405. 

以下是我的代碼,使ajax調用。

var config = { 
      headers : { 
       'Access-Control-Allow-Origin' : '*', 
       'Accept' : 'application/json;odata=verbose', 
       "HOST" : "finance.yahoo.com" 
      } 
     }; 

    var promise = null; 
    promise = $http.get('http://finance.yahoo.com/webservice/v1/symbols/SUZLON.NS/quote?format=json&view=detail',config); 
    return promise; 

我能夠使ajax調用谷歌金融API,但雅虎金融API失敗。

我需要爲我的配置對象設置任何標題嗎? 或者雅虎Rest API端返回Http 405有什麼不同?

下面的代碼谷歌API調用工作正常,無需設置任何標題。

getNseQuote : function(nseScriptCode) { 
    console.log("Inside nseScriptCode : " + nseScriptCode); 

    var promise = null; 
    promise = $http.get('http://www.google.com/finance/info?q=NSE:' + encodeURIComponent(nseScriptCode)); 
    return promise; 
} 
+1

錯誤消息很清楚地解釋了什麼是錯的。研究CORS和/或相同的原產地政策。 TLDR:你不能用你的客戶端JavaScript解決這個問題,並在配置客戶端設置這些頭文件是沒有意義的。 –

+0

它說:「預檢響應中的Access-Control-Allow-Headers不允許請求標頭字段Access-Control-Allow-Origin。」 「Origin'http:// localhost:8080'因此不被允許訪問」我可以理解,我本地主機:8080不允許的來源。如果我從finance.yahoo運行這將工作。那麼這是否意味着這個剩餘的api只能用於內部使用? –

+0

任何解決這個問題的方法都是通過在它周圍添加一些包裝來完成的。 –

回答

0

您可以使用this extension for chrome link。它允許您進行跨域請求。在您將API與應用程序集成之前,請測試API URL,看看它是否正在使用第三方工具,如Postman,它最適合測試API調用。

關於您的錯誤 「對預檢請求的響應未通過訪問控制檢查:否'Access-Control-Allow-Origin' 標題存在於請求的資源上」這意味着服務器未配置爲處理pre -flight request.Pre-flight請求是由瀏覽器在特殊情況下完成的請求,例如當您請求來自不同域的數據(當您正在執行GET/POST以外的請求以及在您的請求中使用任何自定義標頭等)時僅安全目的(我想)..

因此,在你的情況下,你應該使用代理服務器,你可以使用任何可用的開源軟件包......在我的情況下,我使用的是node-http-proxy。瀏覽器調用代理服務器,代理服務器從實際的服務器並將其返回到瀏覽器..它很容易做一點修補...