让JSON回调无效

时间:2011-07-07 12:17:54

标签: jquery json

我想使用这个api返回匹配邮政编码的地方

e.g。对于邮编11233

http://postnummersok.se/api?q=11233

我用这样的用户输入值调用它,但是结果不解析,我怎么能排除故障,甚至得到回调?我的萤火虫没有显示js错误。

$('#zip').live("keyup",function () {
    var zip = this.value.replace(/ /g,'');
    if(zip.length > 4) {
        var url = 'http://postnummersok.se/api?q=' + zip;
        $.getJSON(url, function(data) {
            $('#result').html(data);
        });
    } else {
         $('#result').html('to short');
    }
});

2 个答案:

答案 0 :(得分:3)

我认为您的代码所在的文档不在http://postnummersok.se上。如果不是,那么你会遇到Same Origin Policy,它不会(通常)允许ajax请求跨越原点。

如果这是一项公开服务,他们可能会支持JSON-P,这不受SOP的约束。 jQuery也支持它,因此它可能就像改变代码一样简单:

$.getJSON(url, function(data) {
    $('#result').html(data);
});

到这个

$.ajax({
    url:      url,
    dataType: "jsonp",
    success:  function(data) {
        $('#result').html(data);
    }
});

$.ajax文档中的更多信息。


更新:在评论您正在动态创建查询字符串但未编码参数的其他答案时注意到。如果zip包含必须进行网址编码的任何字符,则您的网址将会混乱。每当创建查询字符串时,您都必须使用encodeURIComponent

var url = 'http://postnummersok.se/api?q=' + encodeURIComponent(zip);

...或者只是将带有键/值对的对象传递给jQuery,它将为您正确地序列化它们。以下是修改上面的ajax调用的结果:

$.ajax({
    url:      'http://postnummersok.se/api',
    data:     {q: zip},
    dataType: "jsonp",
    success:  function(data) {
        $('#result').html(data);
    }
});

更新2 :我很好奇,是的,您可以使用此服务,是的,它使用的是JSON-P。来自http://postnummersok.se/

  

<强> API

     

Vi har ett rest-apitillgängligtföralla。   Skickadinsökfråga直到http://postnummersok.se/api med parametern q somantingenärettpostnummer eller enort。 Svaret kommer som ett JSON-objekt。回调参数异步回调。

...... Google将其翻译为

  

<强> API

     

我们有一个残余api可供所有人使用。   使用参数q将您的查询发送至http://postnummersok.se/api,参数q可以是邮政编码或地点。答案来自JSON对象。回调参数名为callback。

然而,该服务被破坏并返回无效的JSON-P回复。如果你发送

http://postnummersok.se/api?callback=myCallback&q=721+06

......回应是

myCallback(["V\u00c4STER\u00c5S"])myCallback(null)

......它应该在哪里

myCallback(["V\u00c4STER\u00c5S"])

(可能最后有;。)

如果我是你,我会给他们留下关于这个错误的说明。

答案 1 :(得分:1)

这不仅仅是一个AJAX,而是JSONP。

你可以这样做:

$('#zip').live("keyup",function () {
    var zip = this.value.replace(/ /g,'');
    if(zip.length > 4) {
        var url = 'http://postnummersok.se/api?callback=?';
        $.getJSON(url, { q: zip },
            function(data) {
                $('#result').html(data);
        });
    } else {
         $('#result').html('to short');
    }
});

请注意,我添加了“callback =?”到URL,以便jQuery知道它的JSONP,并将zip移动到调用的data参数。有关详细信息,请参阅the docs