【问题标题】:Google Finance JSON reply not working in Chrome, Firefox but works in IE 11Google Finance JSON 回复在 Chrome、Firefox 中不起作用,但在 IE 11 中起作用
【发布时间】:2016-08-11 14:55:34
【问题描述】:

我正在构建一个 JavaScript 应用程序来从 Google Finance API 检索 STOCK 信息。

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

如果我将链接复制粘贴到浏览器中,那么我会正确收到 JSON 回复

// [ { "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" } ]

我也尝试了雅虎财经网址。同样的问题。这是我的网址

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=

这是我的 JS 代码。

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: 即使我只是为了测试代码而添加了一个直接的 http 请求字符串,而不是 var request,responseText 仍然是空的。

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

不知道出了什么问题。 同样在 Chrome 中,我将 readyState 设为 1,将 status 设为 0, 在 Internet Explorer 中,我的 readystae 为 4,状态为 200。*

【问题讨论】:

  • 可能是同源策略?尝试从服务器查询 API,例如curl,而不是客户端js,看看响应是否不同。附言这个 API 不是被弃用了吗? googlecode.blogspot.com/2011/05/…
  • 这是一个几乎有效的 JSON,但它有 // 将注释掉所有 JSON。我认为这是 Google 所做的一种保护,因为 Finance 没有 API (developers.google.com/finance/?hl=es)。
  • 另外:XMLHttpRequest cannot load https://finance.google.com/finance/info?q=nasdaq:AAPL. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://fiddle.jshell.net' is therefore not allowed access. 我建议找到另一个 API stackoverflow.com/questions/10040954/…
  • 我是 JSON 开发的新手。我尝试使用普通的'ipinfo.io/json'字符串而不是财务谷歌链接,但即便如此我也遇到了同样的问题。这是标准请求和 JSON 回复,应该可以工作。
  • @yuriy636 :我在 IE 中格式化了 responseText 字符串,它正确显示了回复,但在 chrome 中它根本不起作用。我可以在格式化字符串后解析 JSON,但 IE 会显示该原始字符串。 Chrome 只是说响应是空的。

标签: javascript json xmlhttprequest google-finance


【解决方案1】:

此过程存在多个问题。第一个问题是您尝试使用 XMLHttpRequest 异步请求数据,但没有像这样处理它。第二个问题是,当您实际发出请求时,如果您尝试在浏览器内的客户端运行它,您将遇到同源策略问题。返回的 JSON 还有另一个问题,因为它是无效的。它附加了两个正斜杠,这使得返回的 JSON 数据的解析错误。

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"));

解决方案:自从Google Finance API is no longer available之后,你可以试试another Stackoverflow post中提到的其他API。

工作示例:

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();

【讨论】:

  • 如果我将 'this.responseText' 放在 window.alert 中,它会显示输出,但函数 getJSONReply 方法中的 xhr.responseText 不会。为什么会这样?
  • 代码在 IE 中也能完美运行,但在 Chrome 中却不行。
  • this.responseText 有效,因为 reqListener 回调函数是使用 XMLHttpRequest 对象作为其 this 值调用的。 xhr 值不存在于reqListener 函数的范围内,因此未定义。
  • 我在 getJSONReply 的主函数中尝试了 xhr.responseTex' 而不是在 reqListener 中。仍然无法在 Chrome 中工作。我可以将this.responseTextreqListener 传递给另一个函数进行解析,对吗?
  • 当您在调用 xhr.send() 函数后尝试在 getJSONReply 中访问 xhr 时,xhr 对象尚未检索到数据。 XMLHttpRequest 是异步发送的。这意味着实际数据是在以后完全获取的,而不是在调用函数时立即获取。 xhr.responseText 在 getJSONReply 函数中不可用,而是在 reqListener 函数中可用。
【解决方案2】:

为什么不制作一个 PHP 脚本来负责检索数据?

您的 Ajax 将使用参数 GET['qparams'] 调用此页面 雅虎的结果格式不正确,所以我清除了它,它会起作用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多