在.jax成功函数中接收.csv文件作为数据

时间:2012-09-03 14:47:27

标签: jquery ajax csv cross-domain jsonp

请考虑这个javascript:

$.ajax({
    url:'http://ichart.finance.yahoo.com/table.csv?s=GS&a=00&b=1&c=2010&d=08&e=3&f=2012&g=d&ignore=.csv',
    type:'get',
    dataType:'jsonp',
    success:function(data){
        alert(data);
    }
})

URL返回.csv文件,但是我指定了jsonp数据类型,因为这是一个跨域的ajax请求。没有该参数,我得到“不允许原点”错误。

由于我指定了jsonp数据类型,因此ajax函数会抛出错误,因为.csv文件不是JSON格式。但是在开发控制台中,我可以看到浏览器会收到一个连贯的.csv文件。所以我知道我已成功接收CSV文件。我认为应该可以,但我不知道如何正确地将这个csv文件接收到我的ajax函数?

当然,如果我可以使这个URL返回一个格式正确的JSON字符串,那将是最好的,但我不确定我能做到。

这是一个小提琴,您可以尝试它,您必须打开开发控制台才能看到错误:http://jsfiddle.net/92uJ4/3/

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

不幸的是,跨域限制意味着这不会起作用。系统是专门构建的,因此您无法使用AJAX提取任意跨域内容。没有任何类型的预解析方法可以将您获得的非JSONP数据转换为实际的JSONP数据(因为这会破坏限制点)。

您将不得不拨打从Yahoo!提取数据的本地服务器。并将其发送到您的AJAX请求,或者找到某种类型的服务,该服务将从任意URL中提取并将数据作为JSONP返回。碰巧,雅虎!提供这样的服务:YQL(Yahoo查询语言)。有关详细信息,请参阅this link

要完成您想要的任务,请使用此小提琴中的代码:http://jsfiddle.net/c5TeM/1/

function get_url(remote_url) {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?"+
"q=select%20*%20from%20html%20where%20url%3D%22"+
encodeURIComponent(remote_url)+
"%22&format=json",
        type: 'get',
        dataType: 'jsonp',
        success: function(data) {
            alert(data.query.results.body.p);
        },
        error: function(jqXHR, textStatus, errorThrow){
            alert(jqXHR['responseText']);
        }
    })
}

答案 1 :(得分:0)

修改最后提供的jsfiddle引导我进入以下解决方案:
http://jsfiddle.net/9zcsxq5a/

Route::pattern("id", "[0-9]+");


  

csv通过asis传递,然后被修改为json对象,类似于你在使用

时获得的那个(但没有日期限制)      

http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.historicaldata%20where%20symbol%20in%20%28%27YHOO%27%29%20and%20startDate%20=%20%272009-09-11%27%20and%20endDate%20=%20%272010-03-10%27&diagnostics=true&env=store://datatables.org/alltableswithkeys