向Yahoo Finance API发出JSONP请求时获得400错误请求

Getting 400 Bad Request when making JSONP request to Yahoo Finance API

本文关键字:请求 错误 JSONP Yahoo Finance API 发出      更新时间:2023-09-26

我想要一个输入字段,当用户用字母输入时,它会建议股票行情,就像你在雅虎或谷歌金融上看到的那样。我不能只使用JSON,除非我启用CORS,在这种情况下它是有效的。以下是我在研究我面临的问题时,从Stack Overflow(这里和这里)上发现的各种问题中拼凑而成的代码。

$("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状态。

我修复了它!

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

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

只是提醒一下-我有几个项目(Java和JavaScript)调用这个API。它们通常工作,但偶尔会在不更改代码的情况下以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>

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