【问题标题】:jquery + jsonp return syntax error even when the response is json即使响应是 json,jquery + jsonp 也会返回语法错误
【发布时间】:2015-05-28 09:32:34
【问题描述】:

为什么会返回语法错误?

http://jsfiddle.net/syng17fv/

jquery.jsonp https://github.com/jaubourg/jquery-jsonp

响应 http://cvrapi.dk/api?search=test&country=dk

$.jsonp({
    url : 'http://cvrapi.dk/api?search=test&country=dk',
    success : function(json){
        console.log('success')
    },
    error : function(){
        console.log('err')
    }
});

更新

这行得通

$.ajax({
        type : 'GET',
        dataType : 'jsonp',
        url : '//cvrapi.dk/api?search=test&country=dk',
        success : function(res){

        }
    });

【问题讨论】:

标签: jquery jsonp


【解决方案1】:

您需要添加一个回调参数。我将在下面详细解释原因。

如果没有回调,JSONP 调用将无法工作。数据加载在脚本标签中,如果代码不是方法调用的形式,结果只是一个被丢弃的对象,永远不会调用成功回调方法。

为什么[不使用回调]返回语法错误?

这就是你的 ajax 响应在没有回调的情况下的样子(例如http://cvrapi.dk/api?search=test&country=dk):

<script> 
{"vat":11618405,"name":"TESTRUP ... (snip)
</script>

这个JavaScript当然有语法错误! :)

这是带有回调的 ajax 响应(例如 http://cvrapi.dk/api?search=test&country=dk&callback=callbackFunc):

<script> 
callbackFunc({"vat":11618405,"name":"TESTR ... (snip)
</script>

现在这是有效的 JavaScript。在这个例子中,$.jsonpcallbackFunc() 的调用,世界上的一切都是正确的。


JSONP 或“带填充的 JSON”的核心元素如下:

  1. 您网站上定义的回调函数。
  2. 通过标签对远程 API 的请求
    • 包含一个特殊参数,提供回调函数的名称
  3. 响应:
    • 只是 Javascript
    • 包括:
      1. 函数调用,您在请求中指定的名称
      2. 参数是感兴趣的 JSON 数据
    • 立即执行,就好像它是从您自己的域中调用的一样

你和服务器之间的这种回调安排,结合 避免同源限制,这确实是 JSONP 的全部技巧

参考:So how does JSONP really work?Wikipedia: JSONP


像这样更改您的 json 代码。奇迹般有效。注意添加的“回调”参数。 JSONP 期望这一点。这是您编辑的 JSFiddle:http://jsfiddle.net/Drakes/syng17fv/2/

参考号:https://github.com/jaubourg/jquery-jsonp/blob/master/doc/TipsAndTricks.md

$.jsonp({
    url : '//cvrapi.dk/api?search=test&country=dk&callback=?',
    success : function(json){
        console.log('success')
    },
    error : function(){
        console.log('err')
    }
});

【讨论】:

  • 嗨@clarkk,这个解释确实解决了你的问题吗?我希望这能满足你的问题,如果是这样,你介意接受这个答案吗?
  • 你的小提琴 jsfiddle.net/Drakes/syng17fv/2 上的代码返回 Refused to load the script 'http://cvrapi.dk/api?search=test&amp;country=dk&amp;callback=_jqjsp&amp;_1488820133245=' because it violates the following Content Security Policy directive: "script-src 'self' https://* 'unsafe-inline' 'unsafe-eval'" 那是在我无法控制的 shopify 环境中。
【解决方案2】:

似乎callback 选项不起作用。只需将回调参数添加到具有默认值的 url (_jqjsp)

url : '//cvrapi.dk/api?search=test&country=dk&callback=_jqjsp',

【讨论】:

  • 我领先你2分钟!但你的眼光也很敏锐
  • 回调有效。查看我更新的 OP 提供的 JSFiddle
【解决方案3】:

分析插件后,url = url.replace( /=\?(&amp;|$)/ , "=" + successCallbackName + "$1" ); 工作得不如make the jsonp callback 好,所以添加一些函数使其工作,或者尝试更改正则表达式以将回调添加到 url。

尝试将url = url.replace( /=\?(&amp;|$)/ , "=" + successCallbackName + "$1" ); in the plugin 替换为以下代码。

function addCallback(paramName, paramValue, url) {

    if (url.indexOf(paramName + "=") >= 0) {
        var prefix = url.substring(0, url.indexOf(paramName));
        var suffix = url.substring(url.indexOf(paramName));
        suffix = suffix.substring(suffix.indexOf("=") + 1);
        suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : "";
        url = prefix + paramName + "=" + paramValue + suffix;
    } else {
        if (url.indexOf("?") < 0)
        url += "?" + paramName + "=" + paramValue;
        else
        url += "&" + paramName + "=" + paramValue;
    }
        return url;

}

url = addCallback('callback', successCallbackName, url);

Updated fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2021-03-24
    • 2020-03-20
    • 1970-01-01
    • 2011-10-11
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多