2016-08-11 1 views
0

Ich erstelle eine JavaScript-Anwendung, um STOCK-Informationen von Google Finance API abzurufen.Google Finanzen JSON-Antwort funktioniert nicht in Chrome, Firefox, funktioniert aber in IE 11

finance.google.com/finance/info?q=nasdaq:AAPL

Wenn ich den Link im Browser kopieren und einfügen dann erhalte ich die JSON Antwort richtig

// [ { "id": "22144" ,"t" : "AAPL" ,"e" : "NASDAQ" ,"l" : "108.51" ,"l_fix" : "108.51" ,"l_cur" : "108.51" ,"s": "0" ,"ltt":"10:48AM EDT" ,"lt" : "Aug 11, 10:48AM EDT" ,"lt_dts" : "2016-08-11T10:48:42Z" ,"c" : "+0.51" ,"c_fix" : "0.51" ,"cp" : "0.47" ,"cp_fix" : "0.47" ,"ccol" : "chg" ,"pcls_fix" : "108" } ] 

Ich habe versucht, Yahoo Finanzen URL auch. Das gleiche Problem auch dafür. Dies war meine url

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22)%0A%09%09&format=json&diagnostics=true&env=http%3A%2F%2Fdatatables.org%2Falltables.env&callback=

Das ist mein JS-Code.

var url = "http://finance.google.com/finance/info?q=nasdaq:"; 

function getJSONReply() 
{ 
    var url_req = url.concat(arguments[0]); 
    alert(url_req); 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() 
{ 
    if (xhr.readyState == 4 && xhr.status == 200) 
    { 
     alert(xhr.responseText.length); 
    } 
} 
    xhr.open('GET', url_req, true); 
    xhr.setRequestHeader('Access-Control-Allow-Headers', '*'); 
    xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); 
    xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET'); 
    xhr.addEventListener("load", reqListener); 
    xhr.send(); 
} 


function reqListener() 
{ 
    var sub1 = this.responseText.substring(5,this.responseText.length); 
    var sub2 = sub1.substring(0, sub1.length - 2); 
    parse_JSON(sub2); 
} 

PS: Statt var Anfrage, auch wenn ich ein direktes http-Request-String, nur um zu testen den Code hinzufügen, noch ist response leer.

xhr.open ('GET', "http://ipinfo.io/json", wahr);

Nicht sicher, was schief läuft. Auch in Chrome bekomme ich readyState als 1 und Status als 0, in Internet Explorer bekomme ich ReadyStaes als 4 und Status als 200. *

+0

Möglicherweise Same Origin Policy? Versuchen Sie, die API von einem Server abzufragen, z. 'curl', anstelle von Client-Seite js und sehen, ob die Antwort anders ist. P.S. Ist diese API nicht veraltet? http://googlecode.blogspot.com/2011/05/spring-cleaning-for-some-of-our-apis.html –

+0

Das ist ein fast gültiges JSON, aber es hat '//', was alle JSON auskommentiert . Ich denke, Google hat eine Art Schutz, denn Finance hat keine API (https://developers.google.com/finance/?hl=es). – yuriy636

+0

Außerdem: 'XMLHttpRequest kann https://finance.google.com/finance/info?q=nasdaq:AAPL nicht laden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'https://fiddle.jshell.net' ist daher nicht erlaubt. 'Ich würde empfehlen, eine andere API http://stackoverflow.com/questions/10040954/alternative-to-google-finance-api – yuriy636

Antwort

1

Es gibt mehrere Probleme mit diesem Prozess. Das erste Problem besteht darin, dass Sie versuchen, Daten mit XMLHttpRequest asynchron anzufordern, sie jedoch nicht als solche behandeln. Das zweite Problem besteht darin, dass Sie beim Ausführen einer Anforderung Probleme mit der Richtlinie für denselben Ursprung haben, wenn Sie versuchen, dies auf der Clientseite in einem Browser auszuführen. Es gibt noch ein weiteres Problem mit dem zurückgegebenen JSON, da es ungültig ist. Es werden zwei Schrägstriche angehängt, die das Parsen der zurückgegebenen JSON-Daten fehlerhaft machen.

function getJSONReply(stock) { 
 
    var url = "https://finance.google.com/finance/info?q=nasdaq:"; 
 
    var request = url.concat(stock); 
 
    window.alert(request); 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.addEventListener("load", reqListener); 
 
    xhr.open('GET', request, true); 
 
    xhr.send(); 
 
} 
 

 
function reqListener() { 
 
    console.log(this.responseText); 
 
} 
 

 
console.log(getJSONReply("AAPL"));

Die Lösung: Da die Google Finance API is no longer available, können Sie andere APIs ausprobieren wie in another Stackoverflow post erwähnt.

Arbeitsbeispiel:

function getJSONReply() { 
 
    var url = "http://ipinfo.io/json"; 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.addEventListener("load", reqListener); 
 
    xhr.open('GET', url, true); 
 
    xhr.send(); 
 
} 
 

 
function reqListener() { 
 
    console.log(this.responseText); 
 
} 
 

 
getJSONReply();

+0

Wenn ich 'this.responseText' in window.alert, dann zeigt es Ausgabe aber xhr.responseText in der Funktion getJSONReply Methode nicht. Warum das ? –

+0

Auch Code funktioniert perfekt in IE, aber nicht in Chrome. –

+0

this.responseText funktioniert, weil die Callback-Funktion 'reqListener' mit dem Objekt' XMLHttpRequest' als 'this'-Wert aufgerufen wird. Der xhr-Wert existiert nicht im Gültigkeitsbereich der Funktion 'reqListener' und ist daher nicht definiert. – 10100111001

0

warum nicht Sie ein PHP-Skript zu machen, die verantwortlich für die Beschaffung von Daten sein wird?

Ihre Ajax wird diese Seite mit args rufen GET['qparams'] Das Ergebnis von Yahoo schlecht formatiertem ist, so dass ich klären und es wird funktioniert

$homepage = file_get_contents('http://finance.google.com/finance/info?q=nasdaq:'.GET['qparams']); 
$homepage = str_replace(array("//"," ","\r","\n"), "", $homepage); 
return $homepage; 
+0

Können Sie den JS-Code auch posten? –

Verwandte Themen