使用jquery.getJson与谷歌的GeoCoding HTTP服务

8

谷歌提供了一个很好的REST接口,用于对地址进行地理编码和逆地理编码。我的API密钥是有效的,如果我直接在浏览器中输入请求,它可以正常工作。但是,下面的jQuery代码失败了,我不明白为什么。希望您能帮助我解决这个问题。

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json",
  function(data, textStatus){
     console.log(data);
  });

Google为其这项服务提供了REST接口文档:http://code.google.com/apis/maps/documentation/geocoding/index.html
4个回答

17

这里的问题是我没有指定 JSONP 回调函数。正确的代码如下:

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?",
  function(data, textStatus){
     console.log(data);
  });

3
它有效是因为你在查询末尾指定了“callback”参数,但如果让jQuery处理它(通过指定“dataType:'jsonp'”),它将无效。请参见:http://blog.mikecouturier.com/2011/03/fix-jquery-jsonp-request-to-google-maps.html - Mike Gleason jr Couturier

3
由于安全限制,您不能从不同域的页面向URL发送AJAX请求。这就是为什么在浏览器中输入URL可行,但通过javascript代码尝试请求时无法正常工作的原因。
常见的解决方法是使用充当代理的服务器端组件:它接收您的AJAX请求并将其发送到Google地理定位服务。请参考此处了解更多信息。

1
根据JQuery网站的说明,$.getJSON原生支持JSONP请求。因此,不需要使用所述的代理。 - Scott
2
只要你调用的远程URL支持JSONP,就没有问题。谷歌已经禁用了上述GeoCoding API V3的JSONP。 - Gabe Sumner
JSONP是绕过浏览器内置的XSS安全机制的一种解决方案,它最初是作为一种安全漏洞出现的,但现在已经被广泛使用,我认为他们永远不会修复它。 - Agile Noob
@Gabe:他们没有禁用它,只是比v2更加安全了 :) - Mike Gleason jr Couturier

0

添加一个错误函数

            error: function(xhr, ajaxOptions, thrownError) {
            alert("Ajax Error: " + xhr.status + "\nMsg: " + xhr.responseText);
        }

并尝试调试,看看是否只是与 JSON 相关的错误。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接