来自Google Fusion表的Get请求有问题

时间:2011-05-30 21:50:03

标签: javascript jquery google-api google-fusion-tables

我一直无法使用HTTP请求查询Google Fusion Tables。如果我在浏览器中粘贴下面查询中的URL,则会以逗号分隔列表返回。但是,当我使用.get函数执行此操作时,数据参数中没有任何内容返回。

我对此很新,所以任何帮助都会受到赞赏。

function query(){
var jqxhr=$.get(
    "https://www.google.com/fusiontables/api/query?sql=SELECT+Address+FROM+914142+WHERE+IsCustomer+%3D+1",
    function success(data, textStatus){
alert(data);})}

5 个答案:

答案 0 :(得分:6)

一段时间以来我一直在努力,而今天下午posted sample code and a working example就如何处理Fusion Tables查询。

简而言之,Mark完全相同的原始政策(http://en.wikipedia.org/wiki/Same_origin_policy),除了一个细节之外还有他的解决方案 - 你需要用$ .get指定“jsonp”数据类型。请继续阅读jQuery .get page

根据您的原始示例,这应该有效:

function query(){
    var queryurl = "<your query url>";
    querytail = "&jsonCallback=?";

    var jqxhr=$.get(queryurl + querytail, queryHandler, "jsonp")
}

function queryHandler(data) {
    // display the first row of retrieved data
    alert(data.table.rows[0]);
}

答案 1 :(得分:0)

由于Same Origin Policy,您可能无法访问Google联合表。

解决此问题的一些方法是通过您自己的服务器代理请求(在与您所服务的网页相同的域上运行)或在JSONP中请求数据。

如果您将参数jsonCallback=<callback name here>附加到Fusion Tables请求,那么您将获得JSONP响应。例如,请求:

https://www.google.com/fusiontables/api/query?sql=SELECT+Address+FROM+914142+WHERE+IsCustomer+%3D+1&jsonCallback=foo

结果:

foo({"table":{"cols":["Address"],"rows":[["3400 California Street, Suite 302, San Francisco, CA 94118"],["1200 Pacific Avenue, San Francisco, CA 94109"],["340 10TH Street, San Francisco, CA 94103"],["One Embarcadero Center, Lobby Level, San Francisco, CA 94111"],["2230 Third Street, San Francisco, CA 94107"],["490 Post St, Suite 430, San Francisco, CA 94102"],["530 Bush St. Suite 101, San Francisco, CA 94108"],["114 Sansome Street, Suite 715, San Francisco, CA 94104"],["3012 Steiner Street Suite A, San Francisco, CA 94123"],["199 Fremont St # 105, San Francisco, CA 94105"],["2007 Irving St., San Francisco, CA 94122"],["450 Sutter Suite 2518, San Francisco, CA 94108"],["275 Gough Street, San Francisco, CA 94102"],["450 Sutter Street Suite 1225, San Francisco, CA 94108"],["2675 Geary Blvd., Ste 400, San Francisco, CA 94118"],["332 Pine St # 505, San Francisco, CA 94104"]]}})

IBM的这篇文章应该有助于您了解JSONP以及如何使用它:http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

答案 2 :(得分:0)

像这样使用JSONP和融合:

function processData(json){
  for (var i, row; row=json.table.rows[i]; i++){
    console.log(row)
  }
}

script = document.createElement("SCRIPT")
script.src = "https://www.google.com/fusiontables/api/query?sql=SELECT+Address+FROM+914142+WHERE+IsCustomer+%3D+1&jsonCallback=processData";
document.getElementsByTagName("HEAD")[0].appendChild(script);

未经测试,你会明白吗?不知道你的lib是否支持任何有用的抽象。

答案 3 :(得分:0)

当我想到这一点时,我意识到通过你自己的服务器运行请求的最简单方法就是假装它是你自己的请求,即在存储的文件中。

所以我刚创建了一个包含我自己域名内容的php脚本

<?php echo file_get_contents('http://www.sameoriginpolicydomain.com'); ?>

这就是诀窍,无论是从AJAX还是直接调用它。这就是你要找的东西:

<?php echo file_get_contents('http://www.google.com/fusiontables/exporttable?query='.urlencode($_GET['query']).'&o=kmllink&g='.$_GET['g']); ?>

答案 4 :(得分:0)

虽然noiv11的答案确实有效,但它不包括那些想知道你无法使用JSONP管理标题的人的授权。为此,您需要使用真实的标头来检索数据,因此需要对cURL进行一些操作,因此需要通过服务器完成。

这是一个有用的PHP类,可以解决这个问题:Fusion Tables Client PHP