【问题标题】:Getting 400 Bad Request when making JSONP request to Yahoo Finance API向 Yahoo Finance API 发出 JSONP 请求时收到 400 Bad Request
【发布时间】:2016-05-07 23:03:23
【问题描述】:

我希望有一个输入字段,可以在用户输入字母时建议股票代码,就像您在 Yahoo 或 Google Finance 上看到的那样。除非我启用 CORS,否则我不能只使用 JSON,在这种情况下它可以工作。这是我在研究我面临的问题时从 Stack Overflow(herehere)上发现的各种问题拼凑而成的代码。

$("input#stocklookup").autocomplete({
    source: function(request, response){
        $.ajax({
            url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?query='+request.term+'&region=US&lang=en-US',
            dataType: 'jsonp',
            jsonpCallback: 'YAHOO.util.ScriptNodeDataSource.callbacks'
        });

        YAHOO = {
            util: {
                ScriptNodeDataSource: {
                    callbacks: function(data) {
                        console.log(data);
                    }
                }
            }
        }; 
    }
})

搜索“a”时,我会收到 400 错误,并且 URL 被列为 http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=a&region=US&lang=en-US&callback=YAHOO.util.ScriptNodeDataSource.callbacks&_=1462660878200

我认为最后的额外数字可能是导致 400 的原因,但我不知道为什么将它附加到 URL。如果您导航到上面的 URL,结果会在您的浏览器中正确显示。

learn jQuery 文档中看到此页面后,我也尝试使用此代码块,但使用此代码时也出现 400 错误。

.$ajax({
            url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?region=US&lang=en-US',
            jsonp: 'callback',
            dataType: 'jsonp',
            data: {
                q: request.term,
                format: 'json'
            },
            success: function(response){
                console.log(response);
            }
        })

如果能帮助我找到正确的方向,我们将不胜感激。谢谢。

更新

$.ajax({
            url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?query='+request.term+'&region=US&lang=en-US',
            cache: true, //<--new
            dataType: 'jsonp',
            jsonpCallback: 'YAHOO.util.ScriptNodeDataSource.callbacks'
        });

        YAHOO = {
            util: {
                ScriptNodeDataSource: {
                    callbacks: function(data) {
                        console.log(data);
                    }
                }
            }
        };

这适用于某些请求,但不适用于其他请求,有些仍然返回 400 状态。

【问题讨论】:

  • 额外的东西可能被 jQuery 附加到末尾,只是为了防止浏览器缓存。您可以在 jQuery 的 ajax 调用中将其关闭,但 JSONP 请求/响应的缓存可能会搞砸。
  • 仅供参考,如果您只是在浏览器中输入:http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=a&amp;region=US&amp;lang=en-US&amp;callback=YAHOO.util.ScriptNodeDataSource.callbacks&amp;_=1462660878200,您将看到 JSONP 响应,因此我认为您的错误与 URL 的 &amp;_=1462660 部分无关.
  • 谢谢!!我把 cache: true 放进去,它起作用了!缓存不是问题,个别股票代码不会经常变化。
  • 呃,缓存对于股票行情来说可能是个大问题。我不知道你的应用是什么,但人们最不想要的是一天前的股票信息。
  • 现在,奇怪的是,有些字母有效,有些则无效。 d.yimg.com/autoc.finance.yahoo.com/… 返回状态 200,d.yimg.com/autoc.finance.yahoo.com/… 返回状态 400。更新原始问题

标签: javascript json jsonp yahoo-api yahoo-finance


【解决方案1】:

我修好了!

将此添加到我的 HTML 文件中。

<meta charset="UTF-8" name="referrer" content="no-referrer">

【讨论】:

    【解决方案2】:

    请注意 - 我有几个调用此 API 的项目(Java 和 JavaScript)。它们通常可以正常工作,但偶尔会失败并显示 400 没有对代码进行任何更改 - 然后在几个小时/几天后再次工作,而无需更改代码。我认为如果服务器有问题,它可能会返回这个而不是 500 范围内的正确错误(服务器错误 - 是我,不是你)

    400 范围内的错误应该是来自服务器的消息,类似于“是你,而不是我 - 在再次发送之前修复你的请求”,但我认为这个 API 不是这种情况。

    例如 - 我的一个请求有效,无效,有效然后无效:

    http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20=%20%22USDGBP%22&env=store://datatables.org/alltableswithkeys
    

    在浏览器中,我得到相同的 400 错误,但出现以下 XML....

    <error xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:lang="en-US">
    <description>
    No definition found for Table yahoo.finance.xchange
    </description>
    </error>
    

    简而言之 - 可能是他们而不是你!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多