我在使用HTTP请求查询Google Fusion表时遇到了问题。如果我在浏览器中粘贴下面查询的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);})}
我之前一直在努力解决这个问题,就在今天下午发布了示例代码和如何处理Fusion Tables查询的工作示例。
简言之,马克对同源政策的看法是完全正确的(http://en.wikipedia.org/wiki/Same_origin_policy),除了一个细节之外,他的解决方案也差不多完成了——您需要用$.get.指定"jsonp"数据类型。请在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]);
}
像这样使用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是否支持任何有用的抽象。
由于同源策略,您可能无法访问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/
当我想到这一点时,我意识到通过自己的服务器运行请求的最简单方法是假装它是自己的请求,即存储在文件中。
所以我只是创建了一个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']); ?>
虽然noiv11的答案确实有效,但它不包括那些想知道的人的授权,因为你不能用JSONP管理头。为此,您需要使用真实的标头来检索数据,因此这将需要使用cURL进行一些工作,因此需要通过服务器来完成。
这里有一个有用的PHP类:Fusion Tables Client PHP