即使响应是json,jquery+jsonp也会返回语法错误



为什么会返回语法错误?

http://jsfiddle.net/syng17fv/

jquery.jsonphttps://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){
        }
    });

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

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

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

这就是您的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。在本例中,带有调用callbackFunc()$.jsonp,世界一切正常。


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

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

您和服务器之间的这种回调安排,与避免同源限制,实际上是JSONP 的全部技巧

REF:那么JSONP究竟是如何运作的呢?,和维基百科:JSONP


像这样更改json代码。工作起来很有魅力。请注意添加了"callback"参数。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')
    }
});

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

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

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

尝试用以下代码替换url = url.replace( /=?(&|$)/ , "=" + 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);

更新的fiddle

最新更新