0

インターネットの親切な人たち、こんにちは。Javascriptを介してGoogle Fusion Tableの更新を行うのに苦労しています...これはちょっとしたブログですが、すべてを1か所ではなく1か所にまとめると思いました。食事の質問(すべて相互に関連しています)。

Fusion TablesからSELECTを実行でき(簡単)、oauthを介して認証トークンを取得することもできます(もう少し作業が必要です)。したがって、RowIDとフィールド名によるフィールド値の更新は合理的と思われます。実行可能である。

google-api-javascript-clientにはかなり良い投稿と例がたくさんありますが、残念ながら、これらの投稿の多くを読んで読んだ後、意図した目的で機能させるために組み合わせて推定することができませんでした:

-Webページのユーザーが、サーバー側のPHPまたはJavaに依存せずに、Fusion Tableに既存のレコードをjavascriptを介して簡単に更新できるようにしたいと思います(Fusion Tablesをデータベースとして使用します)。 oauthなど

上記の点に関する質問:これはjavascriptだけで試みるのが合理的ですか?...または「クライアント」側の戦略を放棄する必要がありますか?...代わりにサーバー側のアーキテクチャを開発します(Fusion Tablesをデータベースとして処理するため) )。

javascriptを介したUPDATEに関するいくつかの特定の質問:A。)UPDATEはREST呼び出しでAPIキーを必要としますか?

B。)...またはREST呼び出しには認証トークンのみが必要ですか?

C。)...またはAPIキーと認証トークンの両方?

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.)UPDATEを実行するためのフュージョンテーブルへの純粋なREST呼び出しは、jQueryライブラリのみを使用してどのように構成およびフォーマットされますか?ヘッダーとPOSTメソッドはURL文字列にどのように含まれますか?..認証トークンはどうですか?また、コールバックはどのように行われますか?

F.1)google-api-javascript-clientの「gapi.client.request」メソッドには、REST呼び出しを送信するための構造があります...それがライブラリが存在する理由だと思いますが、「gapi」はどこでどのように実行されますか。 client.request "は明示的に認証トークンを含みますか?...それはURL文字列の一部であると想定されていますか?

これは、REST呼び出しのためにgapi.client.requestを介してプッシュされているURLの例です...実際のtableIDはもちろん文字列にあり、もちろん以下のアクセストークンはすでに期限切れになっています...しかし基本的なSQLは次のとおりです。UPDATETABLEIDSETSTATUS COMPLETED 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.AHES6ZSCxJu4V0kOXN98H3PBKJon6ynewZ4j

上記は基本的に機能してテーブルを更新するように見えますが、そうではありません。

これが私のテストコードです。何十もの組み合わせを試したので、少し面倒です。

私もコールバックに苦労していることに注意してください...それは(まだ)機能していないので、はい、おそらくコールバックを見ることができれば、状況をよりよくトラブルシューティングすることができます(私はかなり近くにいる必要があると感じています解決策なので、まだあきらめて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>
4

1 に答える 1

1

私はあなたのすべての質問に答えようとします:

  • gapi-client の使用方法については、JavaScript API の例を参照してください。ユーザーを承認するには、すべてのリクエストの API キーと client_id と OAuth スコープが必要です。
  • クライアント側のみのソリューションが必要な場合は、ユーザーに自分のアカウントで認証するように依頼するだけです (上記の例のように)。ただし、共有している特定のテーブルにアクセスしたい場合は、何らかのサーバー側コードが必要です。
  • 私は最初にJSONP APIを使い始めました(あなたが提案したようにjQueryで呼び出しを作成しました)が、その後gapi-clientに切り替えました。その方が簡単で、意味のあるエラー メッセージが表示され、データへのアクセスに問題はありませんでした。

非常によく似た要件がありました。クライアント側のコードを可能な限り使用し、Google アカウントに属する単一のテーブルにアクセスします (データベースとして FT を使用)。重要なのは、いわゆるService Accountを使用することです。ユーザーに承認を求める代わりに、サービス アカウントを使用してサーバー上でこれを行います。

  1. アカウントを作成する
  2. サービス アカウントのテーブルにアクセス許可を設定する
  3. アカウントの認可(アクセストークンの取得)
  4. 承認されたリクエストを行う

次の 2 つのオプションがあります。

  • サーバー経由ですべてのリクエストをフュージョン テーブルにルーティングします (アクセス トークンを追加します)。

また

  • 取得したトークンをクライアント側に渡し、そこからのすべてのリクエストを処理します

2 番目のオプションは危険です。これは、サービス アカウントがパブリックであることを意味するため、このアカウントに付与する権限を慎重に確認する必要があります (つまり、注意を怠ると、レコードを削除する可能性があります)。サーバー側のコードの量を最小限に抑えます。

私のアプリケーションでは、この 2 番目のオプションを選択します。しかし、テーブルの読み取りビューと書き込みビューとして作成したアカウントの可能性を制限します。サービス アカウントは、これら 2 つのビューにしかアクセスできませんでした。読み取りビューでは、アカウントには「閲覧者」権限があるため、テーブル全体を読み取ることができます ( SELECTステートメント)。書き込みビューには「編集者」権限があり、INSERT / UPDATE / DELETEが可能です(ただし、DROPはできません)。

私は個人的に GWT ライブラリを使用しませんでしたが、これが機能しない理由がわかりません。PHP OAuth ライブラリを使用してサーバー側の呼び出しを行いました。私のコードを含むリポジトリは公開されています。あなたにとって興味深い部分は、私の FT 用 Ja​​vaScript ライブラリ (GftLib)サーバー側コード(クライアントへのサービス アカウントのアクセス トークンを取得するための JSONP インターフェイス) かもしれません。

私はあなたのすべての質問に答えたと思います。

于 2012-07-23T19:42:10.003 に答える