【问题标题】:Cannot get CSV text via ajax request无法通过 ajax 请求获取 CSV 文本
【发布时间】:2013-03-14 15:28:48
【问题描述】:

我有一个小问题,无法检索 csv 响应。

这里有一个 csv link to csv

我正在尝试检索此数据,但是响应中的特殊字符存在问题。

我成功接收到数据,但是 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 设置为 text 以便不对数据进行解码。在这种情况下,我收到 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');
    }
});

我尝试使用 .ajax() 参数 contentType、dataType、scriptCharset 等进行试验,但没有帮助。

【问题讨论】:

    标签: jquery ajax csv syntax-error special-characters


    【解决方案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 调用。

    【讨论】:

    • 每次遇到这个跨域问题。在这种情况下,它最终是我试图检索的简单纯文本。这违反跨域政策的原因可能是什么?我将此网址放入浏览器并显示此纯文本有什么不同?不幸的是,服务器不在我的控制之下。
    • @eveferon:用户从完全不同的位置请求资源而加载的网页与用户自己执行此操作(通过将 URL 粘贴到地址栏中)之间存在巨大差异。 SOP 有几个原因,您可能会发现 this question and its answer 有帮助。
    • 感谢您的回答。我相信很多人都在想同样的问题。因此,对于遇到相同问题的人来说,简化的信息是:如果您的浏览器显示来自外部域的内容并且可以访问相应的对象,这并不一定意味着您可以通过编程方式访问它。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2010-12-01
      • 2021-12-27
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多