3

我在使用 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);})}
4

5 回答 5

6

前段时间我一直在努力解决这个问题,就在今天下午发布了示例代码和如何处理 Fusion Tables 查询的工作示例。

简而言之,马克关于同源政策(http://en.wikipedia.org/wiki/Same_origin_policy)是完全正确的,除了一个细节之外,他的解决方案就在那里——你需要指定“jsonp”数据类型用 $.get。继续阅读jQuery .get 页面

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

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]);
}
于 2011-08-11T02:01:45.997 回答
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']); ?>
于 2011-06-22T13:49:23.083 回答
0

由于同源政策,您可能无法访问 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/

于 2011-05-30T22:06:28.203 回答
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);

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

于 2011-05-30T23:53:59.533 回答
0

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

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

于 2011-12-09T15:56:35.493 回答