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

为什么会返回语法错误?

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){ } }); 

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

没有回调,JSONP调用不起作用。 数据加载到脚本标记中,如果代码不是方法调用的forms,结果将只是一个被丢弃的对象,并且永远不会调用成功回调方法。

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

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

  

当然这个JavaScript中存在语法错误! 🙂

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

  

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


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

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

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

REF: JSONP如何真正起作用? ,和维基百科:JSONP


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

REF: 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所以添加一些function使其工作,或尝试更改正则表达式将回调添加到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); 

更新小提琴