谷歌的融合表API V1 - 切实组成REST格式发布更新(Google Fusion Table

2019-06-26 11:12发布

你好善良的人们对互联网的,我挣扎如何更新到谷歌的融合表通过Javascript发生......这是一个有点博客,但觉得还是写了这一切在一个地方,而不是一片吃饭的问题(即都是相互关联)。

我能够做到从Fusion Tables的选择(容易),我还能够通过OAuth(更多一点的工作)来检索身份验证令牌,所以它似乎合理,通过行ID和字段名称字段值进行更新将是可行的。

有一些相当不错的职位和示例,谷歌的API,JavaScript的客户端,但很可惜,阅读和阅读许多帖子后,我还没有成功地能够结合并推断让他们为我的预期目的:

- 我想一个网页的用户被允许做一个简单的更新,通过JavaScript,已经存在的记录在我的融合表(使用Fusion Tables的数据库),不依赖于任何服务器端PHP或Java的OAuth的,等等。

上述点问题:这是一个合理的事情仅仅通过JavaScript来尝试......或者我应该放弃“客户”端战略......,而是开发一个服务器端架构(用于处理数据融合表的分贝? )。

对于通过JavaScript更新一些具体问题:A)是否UPDATE需要在REST调用API密钥?

B中。)......或做的REST调用需要的只是在身份验证令牌?

温度。)......或两个API密钥和身份验证令牌?

D.)是否更新要求“&回调=?” 在REST调用?

E.)能否GWT OAuth的JavaScript库( http://code.google.com/p/gwt-oauth2/ )可以与JavaScript的API-客户端库合并( https://code.google.com/p/谷歌的API,JavaScript的客户端/ )? 或者,这是混合苹果和桔子?

F.)如何将也许一个纯粹的REST调用,为做一个UPDATE融合表组成,并格式化只使用jQuery库? 如何将页眉和POST方法包含在URL字符串?..关于身份验证令牌?怎么会回调做什么?

F.1)在谷歌的API,JavaScript的客户端的“gapi.client.request”方法提交的REST调用的结构。我想这就是为什么图书馆存在:但如何/在哪里呢的“GAPI。 client.request”明确包括身份验证令牌?...是假设是URL字符串的一部分?

下面是正在通过gapi.client.request为REST调用推URL的一个例子......真正TABLEID当然是在字符串中的,当然的访问令牌下面已经过期......但基本SQL是:UPDATE TABLEID SET状态已完成WHERE 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

上面看起来应该基本工作原理以及更新表,但宕织补赫克,其实不然。

这里是我的测试代码,这是一个有点乱,因为我已经尝试了数十种之多组合:

请注意,我还与回调挣扎......因为它不工作(还)不是,是的,也许如果我能看到回电,我可以更好地解决的情况(我觉得我必须相当接近解决方案,所以不想放弃自己的妹妹,并回落到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>

Answer 1:

我试着回答您的问题:

  • 请参阅JavaScript API范例看到GAPI客户端的使用。 您需要为所有请求的API密钥和CLIENT_ID和OAuth的范围,授权的用户。
  • 你想要的是不完全可能的:如果你想有一个客户端的唯一解决方案,所有你能做的就是向用户(像上面这样的例子)与他们的帐户进行身份验证。 但是,如果你想访问你共享一个特定的表,你必须有某种形式的服务器端代码。
  • 我开始使用JSONP API第(创建使用jQuery电话,像你的建议),但随后切换到GAPI客户端。 它很容易,它可以给你有意义的错误消息,并且我没有问题,访问我的数据。

我有非常类似的要求:使用客户端代码尽可能,访问属于我的谷歌账户(使用FT数据库)一个表。 关键是使用所谓的服务帐户 。 相反,要求用户授权的,你这样做与服务帐户在服务器上:

  1. 创建帐户
  2. 设置权限在桌子上的服务帐户
  3. 授权帐户(AQUIRE访问令牌)
  4. 让授权的请求

现在你有两个选择:

  • 路线通过您的服务器的所有请求,融合表(添加访问令牌)

要么

  • 给所获得的令牌到客户端,并处理来自那里所有的请求

第二个选项是危险的,因为这意味着服务帐户是公开的,所以你要仔细检查其权限您给这个帐户(即有可能删除记录,如果你不重视),从你的,但除了减少的服务器端代码量到最小程度。

在我的应用程序选择此第二个选项。 但要限制我的阅读视野,我的表的写视图中创建的帐户的可能性。 和服务帐户只得到了进入这两个观点。 在读查看帐户具有“查看”的权限,因此可以读取整个表(SELECT语句)。 上的写视图它有“编辑” -permission,这使得它能够插入 / 更新 / 删除 (虽然DROP是不可能的)。

我个人没有使用GWT库,但我看不出一个原因,这不应该工作。 我没有与服务器端调用PHP的OAuth库 。 我的代码库是公共的,有趣的部分你可能是我的JavaScript库的FT(GftLib)和服务器端代码 (JSONP接口来获取服务帐户的访问令牌的客户端)。

我想我回答你所有的问题,如果我离开的东西,随时要求澄清。



文章来源: Google Fusion Table API v1 - Properly composed REST format to POST an UPDATE