2012-09-03 14 views
6

perche questo javascript:Ricevere .csv come dati in funzione di successo 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); 
    } 
}) 

L'URL restituisce un file .csv, ma sto specificando il tipo di dati jsonp perché questa è una richiesta AJAX cross-domain . Senza questo parametro ottengo l'errore "L'origine non è consentita".

Poiché si specifica il tipo di dati jsonp, la funzione ajax genera un errore perché il file .csv non è in formato JSON. Ma nella console di sviluppo posso vedere che il browser riceve un file CSV coerente. Quindi so che sto ricevendo il file CSV. Penso che dovrebbe essere possibile, ma non sono sicuro di come ricevere correttamente questo file CSV alla mia funzione Ajax ??

Naturalmente se potessi fare in modo che questo URL restituisse una stringa JSON correttamente formattata sarebbe la migliore, ma non sono sicuro di poterlo fare.

Ecco un violino in cui si può provare, si dovrà aprire la console dev di vedere che l'errore: http://jsfiddle.net/92uJ4/3/

Qualsiasi aiuto è molto apprezzato.

Tim

risposta

7

Purtroppo, le restrizioni tra domini significa che questo semplicemente non è andare a lavorare. Il sistema è stato creato in modo specifico in modo da non poter estrarre contenuti cross-domain arbitrari con AJAX. Non esiste alcun tipo di metodo di pre-analisi per convertire i dati non JSONP che si stanno acquisendo in dati JSONP effettivi (poiché ciò eliminerebbe il punto delle restrizioni).

Dovrete effettuare una chiamata a un server locale che estrae i dati da Yahoo! e lo invia alla tua richiesta AJAX, o trova un servizio di qualche tipo che tirerà da un URL arbitrario e restituirà i dati come JSONP. Come succede, Yahoo! fornisce solo un servizio di questo tipo: YQL (linguaggio di query di Yahoo). Vedi this link per maggiori dettagli.

per compiere ciò che hai intenzione, utilizzare il codice in questo violino: 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

Grazie per l'ottima informazione. Stavo pensando che era il caso che questo metodo di raccolta delle informazioni non fosse realmente fattibile. La tua soluzione sembra fantastica, stavo guardando YQL prima, credo che sia il modo per farlo. –

+0

Questa implementazione salva qualcosa nel database YQL? o recupera i dati per ulteriori manipolazioni? Grazie @JoeC –

+0

@PT_C: Per quanto ne so, non salva nulla nel database YQL. Dovrebbe essere solo un pass-through. Tuttavia, poiché si tratta di una terza parte, non è possibile garantire che non stiano registrando le informazioni che passano attraverso i loro sistemi, quindi non lo userei per qualcosa di sensibile. Sarebbe meglio implementare la propria soluzione lato server per estrarre i dati in quel caso. –

0

modificando l'ultima condizione jsfiddle mi portano alla seguente soluzione:
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

Problemi correlati