2013-03-25 94 views
1

我有一个小问题,不能检索csv响应。无法通过ajax请求获取CSV文本

有可以在这里找到link to csv

我想检索该数据为csv,但有一个与在效应初探特殊字符的问题。

我successfuly收到的数据,但是随后的jQuery试图对其进行解码并通过语法错误: 我的要求是:

$.ajax({ 
    url: 'http://toolserver.org/~daniel/WikiSense/Contributors.php?wikilang=en&wikifam=.wikipedia.org&page=Cloud+computing&since=&until=&grouped=on&order=-edit_count&max=1000&order=-edit_count&format=csv', 
    dataType: "script", 
    success: function(data){ 
     alert('success'); 
    }, 
    error: function(test1, test2, test3) { 
     alert('error'); 
    } 
}); 

的误差(原子%字符指向)

SyntaxError: syntax error 
1004+%28922%2F82%29,SamJohnston,2008-07-26+09%3A40,2013-03-07+18% 

我也尝试将dataType设置为文本以便不解码数据。在这种情况下,我得到了ajax请求的错误。

$.ajax({ 
    url: 'http://toolserver.org/~daniel/WikiSense/Contributors.php?wikilang=en&wikifam=.wikipedia.org&page=Cloud+computing&since=&until=&grouped=on&order=-edit_count&max=1000&order=-edit_count&format=csv', 
    dataType: "text", 
    success: function(data){ 
     alert('success'); 
    }, 
    error: function(test1, test2, test3) { 
     alert('error'); 
    } 
}); 

我试图与阿贾克斯进行实验()的contentType参数,数据类型scriptCharset等它没有帮助。

回答

0

在我看来,这是一个不可接受的跨域请求。阅读herehere了解更多信息

1

dataType: "text"将是正确的。这听起来像是你遇到了Same Origin Policy,它可以防止跨域呼叫。当您说dataType: "script"时,jQuery自动将请求转换为添加script元素,而不是进行实际的ajax调用。添加参考脚本跨域的script元素不违反SOP(这就是为什么我们可以使用像Google和Microsoft这样的CDN作为常用脚本的原因)。但是在抓取CSV时你不能这么做,因为CSV不是(当然)有效的JavaScript代码。

如果您要检索的服务器受您控制,并且您使用的是现代浏览器(其中in this case表示Chrome,Firefox或Opera的近期版本,或使用IE9或更高版本),您可以实现Cross-Origin Resource Sharing,如果服务器允许请求文档的来源,则允许跨源Ajax调用。 CORS基本上意味着对HTTP OPTIONS呼叫作出响应,询问是否可以使用适当的标头发送ajax呼叫。

+0

每当我遇到这个交叉来源问题时。在这种情况下,它最终是一个简单的纯文本,我试图检索。这可能是什么原因违反了交叉来源政策?把这个URL放到浏览器中并显示这个纯文本有什么不同?不幸的是服务器不在我的控制之下。 – eveferon 2013-03-25 08:15:59

+0

@eveferon:用户从完全不同的位置加载请求资源的网页与用户自己做的网页(通过将URL粘贴到地址栏中)之间存在巨大差异。 SOP有几个原因,您可能会发现[此问题及其答案](http://stackoverflow.com/questions/1830050/why-same-origin-policy-for-xmlhttprequest)有帮助。 – 2013-03-25 08:35:39

+0

谢谢你的回答。我确信有很多人想知道同一个问题。因此,针对具有相同问题的人的简化消息是:如果您的浏览器显示来自外部域的内容并且有权访问相应的对象,则这并不一定意味着您可以通过编程方式访问它。 – eveferon 2013-03-25 14:30:08