Google Fusion Table API v1 - 正确组合REST格式以POST更新

时间:2012-07-21 19:10:21

标签: google-fusion-tables

你好,互联网的人, 我正在努力通过Javascript对谷歌融合表进行更新...这是一个博客,但我想我只是把它写在一个地方而不是吃饭问题(这些都是国际米兰) - 相关)。

我可以从Fusion Tables中进行SELECT(简单),我也可以通过oauth(更多工作)检索Auth Token,所以通过RowID和字段值UPDATE更新似乎是合理的。字段名称是可行的。

google-api-javascript-client有很多相当不错的帖子和示例,但是,在阅读和阅读了很多这些帖子之后,我还没有成功地将它们组合起来并进行推断以使它们适用于我的目的:

- 我希望允许网页用户通过javascript对我的Fusion Table中已存在的记录进行简单更新(使用Fusion Tables作为数据库),而不依赖于任何服务器端PHP或用于oauth等的Java

关于上述观点的问题:通过javascript单独尝试是否合理?...还是应该放弃“客户端”策略?...而是开发服务器端架构(用于处理Fusion Tables)作为一个数据库)。

通过javascript更新UPDATE的一些特定问题:    A.)UPDATE是否需要REST调用的API密钥?

B。)......或者REST调用只需要Auth Token吗?

C。)...或API密钥和Auth令牌?

D。)UPDATE是否需要“& callback =?”在REST电话上?

E。)GWT oauth javascript库(http://code.google.com/p/gwt-oauth2/)可以与javascript-api-client库(https://code.google.com/p/google-api-javascript-client/)结合使用吗?或者这是混合苹果和橘子?

F。)如何使用jQuery库来组合和格式化用于进行UPDATE的融合表的纯REST调用?如何将头文件和POST方法包含在url字符串中?.. auth令牌怎么样?以及如何进行回调?

F.1)google-api-javascript-client的“gapi.client.request”方法有一个提交REST调用的结构......我想这就是库存在的原因:但是如何/在哪里“gapi.client.request”明确包含auth令牌?...它是否是URL字符串的一部分?

这是一个通过gapi.client.request推送到REST调用的URL的示例...真正的tableID当然是在字符串中,当然下面的访问令牌已经过期了...但基本的SQL是: UPDATE TABLEID SET STATUS已完成ROWID 2

https://www.googleapis.com/fusiontables/v1/query?sql=UPDATE%20 TABLEID%20SET%20STATUS%20%3D%20COMPLETED%20WHERE%20ROWID%20%3D%20'2'& access_token = ya29.AHES6ZSCxJu4V0kOXN98H3PBKJon6ynewZ4jI4w9iFs3IOs7

以上看起来应该基本上可以工作并更新表格,但是dang darn heck,不会。

这是我的测试代码,因为我尝试了很多种组合,所以它有点混乱:

请注意,我也在努力应对回调...因为它还没有工作(是),是的,也许如果我能看到回电话我可以更好地解决问题(我觉得我必须公平接近解决方案,所以不想放弃,然后回到PHP服务器端)...所以对回调的任何帮助都会非常感激。

提前感谢您提供的任何帮助/见解。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Page Language="C#" %>
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled 1</title>
<script type="text/javascript" src="gwt-oauth2.js"></script>
<script src="https://apis.google.com/js/client.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>

<form id="form1" runat="server">
  <div data-role="fieldcontain" id="div-myButton1" >
     <p></p>
        <input type="button" id="myButton1" value="oAuth & Get Token" />
     <p></p>
   </div>

 <p id="myOutput"><i>token goes here 3...</i></p>

<div data-role="fieldcontain" id="div-myButton2" >
     <p></p>
        <input type="button" id="myButton2" value="Attempt Fusion Table Update" />
     <p></p>
</div>

<p id="myOutput2"><i>transmitted POST url here...</i></p>

<p id="insert-data-output"><i>Fusion table callback status here...</i></p>

<script type="text/javascript">
$( "#myButton1" ).click(function() {
 //Using the GWT oauth2 javascript library to get the Auth token
 //...as was not able to explicitly retrieve token using the google-api-javascript 
 //alert("got here");
 var GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/auth";
//my client ID
var GOOGLE_CLIENT_ID = "YOURID.apps.googleusercontent.com";
var PLUS_ME_SCOPE = "https://www.googleapis.com/auth/plus.me";
//
var req = {
     "authUrl" : GOOGLE_AUTH_URL,
     "clientId" : GOOGLE_CLIENT_ID,
     //"scopes" : [ PLUS_ME_SCOPE ],
     "scopes" : ['https://www.googleapis.com/auth/fusiontables'],
   };
   oauth2.login(req, function(token) {
     //alert("Got an OAuth token:\n" + token + "\n"
     //    + "Token expires in " + oauth2.expiresIn(req) + " ms\n");
     //
     myOutput.innerText = token;
     //
   }, function(error) {
     alert("Error:\n" + error);
   });
 });
 </script>  

 <script type="text/javascript">
 $( "#myButton2" ).click(function() {
 //Attempting to update a Fusion Table record using gapi, google-api-javascript
 //...as was not able to update using the GWT javascript library
 //
 //TBD???: Where does the auth Token go when composing the REST update string?...tac on to the end?
 //??does UPDATE also require the API key?...if so where in the string?
 //
 //alert("got here");
 //myOutput2.innerText = "got here";
 //
 //my Fusion Table: TABLEID
 var query = "UPDATE TABLEID SET STATUS = COMPLETED WHERE ROWID = '2'";
 var encodedQuery = encodeURIComponent(query);
 // Construct the URL
 //the push seems to be putting in extra commas! :-(
 //var url = ['https://www.googleapis.com/fusiontables/v1/query'];
 var url = 'https://www.googleapis.com/fusiontables/v1/query';
 //url.push('?sql=' + encodedQuery);
 url = url + '?sql=' + encodedQuery;
 //my API key
 //url.push('&key=YOURAPIKEY');
 //Is the API Key required?
 //&access_token=
 //another choice might be to drop the API key, and put in the access token
 //url.push('&access_token=');
  myAccessTokenIs = '&access_token=' + myOutput.innerText;
  //url.push(myAccessTokenIs);
  url = url + myAccessTokenIs;
  //maybe drop the call back stuff too???
  //url.push('&callback=?');
  //
  //alert("my url is: " + url);
  myOutput2.innerText = url;
  //
  var path = '/fusiontables/v1/query';
  //
  //used for the callback of the gapi.client.request
  var callback = function(what) {
  alert("got to call back??");
  var output = JSON.stringify(what);
  insert-data-output.innerText = output;
  };
  ////var callback = function(element) {
  //    return function(resp) {
  //    var output = JSON.stringify(resp);
  //    document.getElementById(element).innerHTML = output;
  //};
  // 
  gapi.client.request({
    path:path,
    body: url,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    method:'POST'},
   callback
   );
  });
 </script>  

 <script>
  function helloCallBack(callback) {
   //callback('insert-data-output');
 };
 </script>
 </form>
 </body>
 </html>

1 个答案:

答案 0 :(得分:1)

我试着回答你的所有问题:

  • 请参阅JavaScript API example以了解gapi-client的用法。您需要所有请求的API密钥以及client_id和OAuth范围来授权用户。
  • 您想要的并非完全可能:如果您只想要一个客户端解决方案,您只需要求用户对其帐户进行身份验证(如上例所示)。但是,如果要访问共享的一个特定表,则必须使用某种服务器端代码。
  • 我首先开始使用JSONP API(使用jQuery创建调用,就像你建议的那样),但后来切换到了gapi-client。它更容易,它可以为您提供有意义的错误消息,我没有问题来访问我的数据。

我有非常相似的要求:尽可能使用客户端代码,访问属于我的Google帐户的单个表(使用FT作为数据库)。关键是使用所谓的Service Account。您可以使用服务帐户在服务器上执行此操作,而不是要求用户进行授权:

  1. 创建帐户
  2. 在服务帐户的表格上设置权限
  3. 授权帐户(获取访问令牌)
  4. 提出授权请求
  5. 现在您有两个选择:

    • 通过服务器将所有请求路由到融合表(添加访问令牌)

    OR

    • 将获取的令牌提供给客户端,并处理来自那里的所有请求

    第二个选项很危险,因为这意味着服务帐户是公开的,因此您必须仔细检查您为此帐户授予的权限(即,如果您不注意,可以删除记录),但不要从中可以减少服务器端代码的数量。

    在我的应用程序中,我选择第二个选项。但是为了限制我创建的帐户的可能性作为读取视图和我的表的写入视图。服务帐户只能访问这两个视图。在读取视图上,该帐户具有“查看者”权限,因此可以读取整个表( SELECT 语句)。在write-view上它有“Editor”-permission,这使得 INSERT / UPDATE / DELETE 成为可能(尽管 DROP 是不可能的。)

    我个人没有使用GWT库,但我看不出为什么这不起作用的原因。我使用PHP OAuth library进行了服务器端调用。使用我的代码的存储库是公共的,有趣的部分可能是我的JavaScript library for FT (GftLib)server side code(用于获取服务帐户访问令牌到客户端的JSONP接口)。

    我想我回答了你所有的问题,如果我留下了什么,请随时要求澄清。