2012-09-03 12 views
6

のデータとしての.csvファイルを受信し、このJavaScriptを検討してください:はAJAX成功機能

$.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ファイルを返しますが、これはクロスドメインAJAX要求であるので、私はjsonpデータ型を指定しています。そのパラメータがなければ、 "origin is not allowed"というエラーが出ます。

データ型をjsonpと指定しているため、.csvファイルがJSON形式ではないため、ajax関数はエラーをスローします。しかし、デベロッパーコンソールでは、ブラウザが一貫した.csvファイルを受け取ることがわかります。だから、私はCSVファイルをうまく受信していることを知っています。私はそれが可能でなければならないと思うが、私は正しくどのように私のajax関数にこのcsvファイルを受信するか分からない??

もちろん、このURLが正しい形式のJSON文字列を返すようにすることができますが、私はそれを行うことができるかどうかはわかりません。ここで

は、あなたがそれを試すことができますフィドルで、あなたはそのエラーを参照してくださいDEVコンソールを開く必要があります:http://jsfiddle.net/92uJ4/3/

すべてのヘルプは大歓迎です。

チーム

答えて

7

残念ながら、ドメイン間の制限は、これが機能しないことを意味します。システムは、AJAXで任意のクロスドメインコンテンツを取得できないように特別に構築されています。 JSONP以外のデータを実際のJSONPデータに変換するための事前解析メソッドはありません(制約のポイントを打破するためです)。

あなたは、Yahoo!からデータを取得するローカルサーバーを呼び出すかAJAXリクエストに送信するか、任意のURLから取得してJSONPとして返すサービスを探します。それが起こると、Yahoo!そのようなサービスを提供しています: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']); 
     } 
    }) 
} 
+0

素晴らしい情報がありますように。私は、情報を引き出すこの方法が本当に実現可能ではなかったと考えていました。あなたのソリューションは素晴らしく、前にYQLを見ていましたが、そうする方法があると思います。 –

+0

この実装はYQLデータベースに何かを保存しますか?それとも、それ以上の操作のためにデータを取得するだけですか?ありがとう@JoeC –

+0

@PT_C:私の知る限り、YQLデータベースには何も保存されません。それはちょうどパススルーでなければなりません。しかし、これはサードパーティーなので、システムを通過する情報がログに記録されないことを保証することはできません。したがって、これを機密扱いには使用しません。その場合、データを引き出すための独自のサーバー側ソリューションを実装する方がよいでしょう。 –

0

jsfiddle次のソリューションに私を導く提供:
http://jsfiddle.net/9zcsxq5a/

var str_parse = function(data){ 
    data = data.replace(/<[/]*body[^>]*>/g,''); 
    data = data.replace(/<--[\S\s]*?-->/g,''); 
    data = data.replace(/[\r]+/g,''); 
    data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,''); 
    data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,''); 
    data = data.replace(/<script.*\/>/,''); 
    return data 
} 

get_url = function(URL){ 
    $.ajax({ 
    url:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"+ 
    encodeURIComponent(URL)+"%22", 
    dataType: "jsonp", 
    type: 'get', 
    success: function(r){ 
     data=r.results[0]; 
     data = str_parse(data); 
     data = data.split(/[\n]+/); 

    //// first line of the csv holds the colnames 
     var HEADER = data[0].split(","); 
     data.shift(); 

    /// create { OBJECT } structure for each row 
     data = (function(){ 
     var o=[]; 
     data.forEach(function(E){ 
      o.push((function(){ 
      var _o={}; 
      for(var i=0, s=E.split(",");i<s.length;i++) 
       _o[HEADER[i]]=s[i]; 
      return _o; 
      }())); 
     }); 
     return o; 
     }()); 

    /// THE FINAL OBJECT 
     console.log(data); 
     return data; 
    } 
    }); 
} 

$('#a').click(function() { 
    get_url("http://ichart.finance.yahoo.com/table.csv?a=8&b=11&e=10&g=d&c=2005&d=2&f=2016&s=YHOO"); 
}); 


The csv is passed through, asis and will then be modified to become a json object, similar to the one (but whithout date restrictions) that you will, get when you use

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

関連する問題