显示JSON将不起作用

时间:2012-08-14 09:33:16

标签: javascript html json jsonp

看看这个小提琴: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 =?但我不得不添加它,因为我收到了错误。

提前致谢!

2 个答案:

答案 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);
});​