2011-05-30 37 views
3

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

我对此很新,所以任何帮助将不胜感激。

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);})} 

回答

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/

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是否支持任何有用的抽象。

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']); ?> 
6

我用这个就在今天下午的如何处理数据融合表的查询posted sample code and a working example挣扎了一会儿回来,和。简而言之,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]); 
} 
+0

真棒是不够的! – steenhulthin 2011-10-12 18:47:00

+1

注意Fusion Tables的[jsonpAPI](http://googleresearch.blogspot.com/2012/06/introducing-new-fusion-tables-api.html)刚刚发布。 – 2012-06-26 23:22:27

0

虽然noiv11的回答不工作,它不包括授权那些想知道,你不能与JSONP管理的标头。为此,您将需要使用真正的头文件来检索数据,因此这需要使用cURL进行一些工作,因此需要通过服务器完成。

下面是一个很有用的PHP类:窍门:Fusion Tables Client PHP