我有一個頁面使用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類似。
我該如何克服這個問題?我無法相信,在現代網絡中,無法從分佈式服務器獲取一串文本而無需刷新頁面。它看起來是一個很強的限制。事實上,我認爲應該允許跨域的客戶端,而不是外部服務器(通常不在客戶端的控制範圍之外)。
*「看起來像是一個很強的限制」*好吧,安全性很重要。 *「我認爲這是客戶誰應該能夠允許跨域,而不是外部服務器」*再一次,安全性很重要:) https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy –
沒有辦法,除非外部域允許跨域請求(通過JSONP或CORS)。可能的解決方法是在服務器上獲取該文件並將其傳遞給AJAX請求的代理腳本。 – hindmost
我同意安全性很重要,但我的抱怨是,CORS提供的解決方案看起來不太安全(似乎有可能被惡意的人繞過它,而不是談論服務器端的錯誤配置,而客戶端無法控制),同時給開發人員帶來一些負擔 – user1156544