为什么会返回语法错误?
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"的核心元素如下:
- 在您的网站上定义的回调函数
- 通过标记向远程API发出请求
- 包括一个特殊参数,用于提供回调函数的名称
- 答复:
- 只是Javascript
- 包括:
- 函数调用,您在请求中指定的名称
- 自变量是感兴趣的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