看看这个小提琴:http://jsfiddle.net/3JRU6/
$(document).ready(function(){
var url='http://api.worldbank.org/topic/4?per_page=10&format=json&callback=?';
var query;
$('button').click(function(){
$.getJSON(url,function(json){
$.each(json.results,function(i,data){
window.alert("found");
$("#results").append('<p>'+data.value+'</p>');
});
});
});
});
我想连接到世界银行的opendata但是当我按下按钮时,没有任何反应。我用twitter API尝试了相同的脚本然后它确实有效。原始链接没有&amp; callback =?但我不得不添加它,因为我收到了错误。
提前致谢!
答案 0 :(得分:4)
如果URL包含回调属性,getJSON
方法将进行JSONP调用。
“如果URL包含字符串”callback =?“(或类似,如定义的那样) 通过服务器端API),请求被视为JSONP。“
参考:http://api.jquery.com/jQuery.getJSON/
请求正常,数据到达浏览器,但由于响应是JSON而不是JSONP,数据只是被丢弃,并且不会调用成功回调方法。
我尝试在网址中将format=json
更改为format=jsonp
,但回复是错误消息:
<fault>
<faultstring>Fault raised in a policy</faultstring>
<detail>
<errorcode>31326</errorcode>
<trace>
Fault Name: JSONP Bad Request
Error Type: MessageRouter
Description: Fault raised in a policy
Service: worldbank
Endpoint: target
Operation (Target):defaultOperation
FlowTransitionState : Target_Request_User_Error
Policy : EnforceMediationOnRequestPolicy
RaiseFaultAssertion
</trace>
</detail>
</fault>
您必须向您的API提供商咨询如何发出JSONP请求而不是JSON请求。
正如Jimmy Oliger所说,API使用prefix
属性而不是callback
。我尝试了这个,jQuery实际上使用了该属性,并调用了成功回调。
响应是一个数组,其中第一项是分页信息,第二项是包含数据的数组,因此循环json[1]
以显示数据:
演示:http://jsfiddle.net/Guffa/3JRU6/4/
var url = 'http://api.worldbank.org/topic/4?per_page=10&format=jsonp&prefix=?';
var query;
$('button').click(function() {
$.getJSON(url, function(json) {
$.each(json[1], function(i, data) {
$("#results").append('<p>' + data.value + '</p>');
});
});
});
答案 1 :(得分:3)
Wordbank API不使用callback
属性将响应输出为JSONP
,您必须在网址末尾添加format=jsonP&prefix=?
才能使其生效。
您可以找到有关“请求格式”here的更多信息。
var url = 'http://api.worldbank.org/topic/4?per_page=10&format=jsonP&prefix=?';
$.getJSON(url, function(data) {
console.log(data);
});