2015-04-25 83 views
4

我試圖做一個簡單的$.getJSON請求發送到以下網址: http://dev.markitondemand.com/Api/v2/InteractiveChart/json?parameters=%7B%22Normalized%22%3Afalse%2C%22NumberOfDays%22%3A7%2C%22DataPeriod%22%3A%22Day%22%2C%22Elements%22%3A%5B%7B%22Symbol%22%3A%22NUS%22%2C%22Type%22%3A%22price%22%2C%22Params%22%3A%5B%22c%22%5D%7D%5D%7D

否「訪問控制允許來源'標題出現在請求的資源上。因此'Origin'http://localhost:1337'不允許訪問。

我的代碼是非常簡單的:

var ticker = "CRR"; 
var url = "http://dev.markitondemand.com/Api/v2/InteractiveChart/json?parameters=%7B%22Normalized%22%3Afalse%2C%22NumberOfDays%22%3A7%2C%22DataPeriod%22%3A%22Day%22%2C%22Elements%22%3A%5B%7B%22Symbol%22%3A%22" + ticker + "%22%2C%22Type%22%3A%22price%22%2C%22Params%22%3A%5B%22c%22%5D%7D%5D%7D"; 

$.getJSON(url, function(data) { 
    console.log(data); 
}).success(function() { 
    $('#show-data').html("Successfully retrieved data."); 
}).error(function() { 
    $('#show-data').html("Service Unavailable."); 
}); 

它沒有運行任何錯誤或成功的功能,我得到了同樣的事情,當我嘗試$.ajax代替。至於我的設置,我正在試驗一個MEN項目,所以我的本地主機上的Mongo,Express和Node.js。任何幫助,將不勝感激。

+0

你可以嘗試設置'''dataType:'jsonp''''你也必須使用回調函數 - 請參閱http://stackoverflow.com/questions/5943630/basic-example-of-使用-ajax-with-jsonp –

回答

5

你顯然在嘗試跨域Ajax請求。這意味着您嘗試聯繫與源網頁所在網域不同的域/端口上的服務器。這被稱爲交叉原點請求,默認情況下不允許。您可以閱讀關於瀏覽器的相同來源安全策略here

爲了被允許直接創建一個交叉源請求,您提出請求的服務器必須特別允許它。

Access-Control-Allow-Origin header是允許這種類型的訪問的一種方式,但它顯然不適用該頭,因此請求被瀏覽器拒絕。你可以閱讀CORS(跨源資源共享)如何工作here

使用JSONP(也需要目標服務器協作以支持JSONP請求)或通過代理(您可以聯繫的另一個服務器,可以向請求的服務器發出請求爲你,並返回結果)。該代理需要您有權訪問的服務器上的自己的服務器代碼,但不需要目標服務器的合作。

根據the doc on this page,似乎Markit On Demand確實支持JSONP,因此您可以將該表單用於跨源請求。如果您爲$.ajax()設置適當的dataType: "jsonp"選項,jQuery的ajax支持該格式。

+0

謝謝你的深入解答。我以前很怕那個。請求的文檔發出了一個jsonp請求,但是這導致了500服務器錯誤(當我嘗試使用無效的參數進行請求時發生的錯誤 - 錯誤處理等)。最後,我最終使用了Quandl,但至少現在我完全理解了爲什麼。希望這可以幫助其他人。謝謝。 :) – Lindsay

0

此消息正在顯示,因爲服務器不允許通過Ajax的跨源資源。因此,要麼服務器管理員爲您啓用cors,要麼嘗試使用JSONP(如果服務器支持)。

http://enable-cors.org/server.html

相關問題