2012-09-03 2 views
6

Bitte beachten Sie, dieses javascript:CSV-Datei als Daten in Ajax-Erfolg Empfangsfunktion

$.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); 
    } 
}) 

Die URL eine CSV-Datei zurückgibt, aber ich bin unter Angabe der jsonp Datentyp, da dies eine Cross-Domain-Ajax-Anforderung ist . Ohne diesen Parameter bekomme ich den Fehler "Ursprung ist nicht erlaubt".

Da ich den jsonp Datentyp angeben, gibt die AJAX-Funktion einen Fehler aus, da die CSV-Datei nicht JSON-Format ist. Aber in der Dev-Konsole kann ich sehen, dass der Browser eine kohärente CSV-Datei empfängt. Ich weiß also, dass ich die CSV-Datei erfolgreich erhalten habe. Ich denke, dass es möglich sein sollte, aber ich bin nicht sicher, wie man diese csv-Akte zu meiner Ajaxfunktion richtig empfängt ??

Natürlich könnte ich diese URL eine korrekt formatierte JSON-Zeichenfolge zurückgeben, die die beste wäre, aber ich bin mir nicht sicher, ob ich das tun kann. Hier

ist eine Geige, wo man es versuchen, werden Sie die Entwickler-Konsole öffnen, müssen diese Fehler zu sehen: http://jsfiddle.net/92uJ4/3/

Jede Hilfe wird sehr geschätzt.

Tim

Antwort

7

Leider bedeutet Cross-Domain-Einschränkungen, dass dies einfach nicht funktionieren wird. Das System wurde speziell so konzipiert, dass Sie mit AJAX keine beliebigen domainübergreifenden Inhalte abrufen können. Es gibt keine Art von Pre-Parse-Methode, um die Nicht-JSONP-Daten, die Sie erhalten, in tatsächliche JSONP-Daten zu konvertieren (da dies den Zweck der Einschränkungen zunichte machen würde).

Sie müssen entweder einen lokalen Server anrufen, der die Daten von Yahoo! und sendet es an Ihre AJAX-Anfrage oder sucht nach einem Dienst, der von einer beliebigen URL abruft und die Daten als JSONP zurückgibt. Wie es passiert, Yahoo! bietet nur einen solchen Dienst: YQL (Yahoo Query Language). Weitere Informationen finden Sie unter this link.

Um das zu erreichen, was Sie wollen, Sie den Code in dieser Geige verwenden: 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

Danke für die tolle Information. Ich dachte, dass diese Methode der Informationsgewinnung nicht wirklich durchführbar ist. Ihre Lösung sieht gut aus, ich habe YQL schon einmal angeschaut, ich schätze, das ist der richtige Weg. –

+0

Speichert diese Implementierung irgendetwas in der YQL-Datenbank? oder ruft es nur die Daten für weitere Manipulation ab? Danke @JoeC –

+0

@PT_C: Soweit ich weiß, speichert es nichts in der YQL-Datenbank. Es sollte nur ein Durchlauf sein. Da es sich jedoch um eine Drittpartei handelt, können Sie nicht garantieren, dass sie die Informationen, die ihre Systeme durchlaufen, nicht protokollieren. Daher würde ich dies nicht für sensible Zwecke verwenden. Es wäre besser, eine eigene serverseitige Lösung für das Ziehen von Daten in diesem Fall zu implementieren. –

0

Ändern die letzten hat mich zu folgenden Lösung jsfiddle führen:
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