如何使用JSONP

时间:2013-01-13 15:52:49

标签: javascript ajax cross-domain jsonp

我有以下代码

function exista(word) {
    alert(word);
    var exists = 1;
    jQuery.ajax({
        async: false, 
        url: "http://api.wordreference.com/0.8/key/json/roen/" + word,
        dataType: 'json',
        method: "GET",
        success: function(transport) {
            if (transport.Error || transport.Response)
                exists = 0;
        }

    });
    return exists;
}

用于验证字典中是否存在单词。问题是它给出了Access-Control-Allow-Origin错误。从我收集的内容来看,似乎我必须使用JSONP,但我无法弄清楚如何(抱歉,我刚开始学习JavaScript等等)。那么,对如何修改上面的代码有任何想法?

谢谢。

2 个答案:

答案 0 :(得分:2)

您的dataType应该是jsonp,而不是'json`。

<强>更新

根据http://www.wordreference.com/docs/api.aspx

  

此外,对于JSPONp,JSON API可以进行可选的回调   函数在查询字符串中;只需添加“?callback = {yourCallback}”即可   URL的结尾。

所以API确实支持JSONP。

此外,JSONP表示“带填充的JSON”,因此您将获得JSON响应。 JSONP仅允许使用CORS

dataType更改为jsonp

  

“jsonp”:使用JSONP加载JSON块。添加一个额外的   “?回调=?”到URL的末尾以指定回调。禁用   通过将查询字符串参数“_ = [TIMESTAMP]”附加到缓存来缓存   URL除非cache选项设置为true。

您可以通过使用jsonpCallback设置指定一个来覆盖默认回调。

最后,您还应添加错误处理程序并将async设置为true

jQuery.ajax({
    "async": true, //cannot be false for JSONP
    "url": "http://api.wordreference.com/0.8/key/json/roen/" + word,
    "dataType": 'jsonp',
    "method": "GET",
    "error": function (jqXHR, textStatus, errorThrown) {
        //included so you can see any errors
        console.log(textStatus + ': ' + errorThrown);
    },
    "success": function (data, textStatus, jqXHR) {
        //According to API documentation
        //data will not likely contain either Error, or Response
        //so, exists will likely not change to 0
        if (data.Error || data.Response) {
            exists = 0;
        }
    }
});

<强>更新

错误和“需要同步”的解决方案将是Pointy之前指出的。您必须创建一个与脚本在同一域上运行的服务器端代理。

服务器端代理可以返回JSONP,但坦率地说只返回JSON或XML更简单,因为CORS不是问题,代理可以是同步的。对于PHP示例脚本,Yahoo! Developer Network个主机source code for a simple proxy

关于服务器端Web服务代理的任何其他内容,您需要指定您正在使用的服务器语言(并且它可能更适合作为不同的问题)。

答案 1 :(得分:0)

要使JSONP正常运行,您不仅需要在 方面对其进行编码,而且您要定位的网站也必须以这种方式使用,并相应地响应请求

如果其他站点已经没有JSONP API,并且您无法控制它,则JSONP不是答案。您必须创建自己的服务器端代理。

编辑 - 根据网站,他们确实支持JSONP。你只需要添加“?callback =?”到URL的末尾。