2016-11-16 41 views
1

我有一個頁面使用ZingChart並通過Ajax從其他域中的多個URL加載數據。該數據是CSV文件,如:通過Ajax獲取CSV避免CORS

1, 2, 3, 4, 5 

或者:

2.34,1.01,4.56 

我需要的是通過這種方式來訪問這些文件,並構造一個JSON用於ZingChart:

{"data":[THE_CSV_GOES_HERE], "name":"WHATEVER"} 

我的第一個問題是,我碰到了通常的CORS問題(其用處我仍然不太清楚),並且由於我無法控制承載CSV的服務器,我用這個解決方法爲explained here

$.ajax({ 
    url:"http://otherdomain/test.csv", // This is dynamically placed 
    dataType: 'jsonp', 
    success:function(res){ 
     return res; 
    }, 
    error:function(r, error){ 
     alert("Error " + error); 
    }  
}); 

這就提出了一個parsererror,我想是因爲CSV不是JSON格式。

如果我使用的「文本」,而不是「JSONP」我得到的CROS錯誤(No 'Access-Control-Allow-Origin' header is present on the requested resource.)如果我使用「文本JSONP」作爲documentation,我仍然得到了parsererror。如果我使用crossDomain: true, dataType: 'text'來強制跨域,但指定它是文本,我仍然會收到CORS錯誤。

看來我的問題與this person類似。

我該如何克服這個問題?我無法相信,在現代網絡中,無法從分佈式服務器獲取一串文本而無需刷新頁面。它看起來是一個很強的限制。事實上,我認爲應該允許跨域的客戶端,而不是外部服務器(通常不在客戶端的控制範圍之外)。

+0

*「看起來像是一個很強的限制」*好吧,安全性很重要。 *「我認爲這是客戶誰應該能夠允許跨域,而不是外部服務器」*再一次,安全性很重要:) https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy –

+0

沒有辦法,除非外部域允許跨域請求(通過JSONP或CORS)。可能的解決方法是在服務器上獲取該文件並將其傳遞給AJAX請求的代理腳本。 – hindmost

+0

我同意安全性很重要,但我的抱怨是,CORS提供的解決方案看起來不太安全(似乎有可能被惡意的人繞過它,而不是談論服務器端的錯誤配置,而客戶端無法控制),同時給開發人員帶來一些負擔 – user1156544

回答

1

你可以嘗試獲取帶有服務器端請求的csv文件,如here,然後只需讓您的ajax調用您的服務器端Web方法來獲取csv字符串。

+0

我已經通過創建一個新的服務器端Web方法解決了這個問題......它只是讀取URL的全部內容並將其傳遞。不是最有效的解決方案,但它的工作。 – user1156544

1

你在爲你的網站的後端/託管環境使用什麼?你可以簡單地訪問CSV並從後端返回它們,因爲你不應該有這個問題從服務器端訪問它們...