0

看看这个小提琴: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>');
      });
    });
  });
});​

我想连接到世界银行的开放数据,但是当我按下按钮时,什么也没有发生。我已经使用 twitter API 尝试了相同的脚本,然后它确实起作用了。原始链接没有 &callback=? 但我不得不添加它,因为我遇到了一个错误。

提前致谢!

4

2 回答 2

4

getJSON如果 URL 包含回调属性,该方法将进行 JSONP 调用。

“如果 URL 包含字符串“callback=?”(或类似的,由服务器端 API 定义),则请求将被视为 JSONP。

参考:http ://api.jquery.com/jQuery.getJSON/

请求工作正常,数据到达浏览器,但由于响应是 JSON 而不是 JSONP,数据只是被丢弃,不会调用成功回调方法。

我尝试在 URL 中更改format=jsonformat=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>');
        });
    });
});
于 2012-08-14T09:50:36.397 回答
3

Wordbank API 不使用该callback属性将响应输出为JSONP,您必须format=jsonP&prefix=?在 URL 的末尾添加才能使其正常工作。

您可以在此处找到有关“请求格式”的更多信息。

var url = 'http://api.worldbank.org/topic/4?per_page=10&format=jsonP&prefix=?';

$.getJSON(url, function(data) {
  console.log(data);
});​
于 2012-08-14T09:48:34.683 回答