6

私はBigQueryを初めて使用します (そして実際に Google API を使用することはまったくありません)。JavaScript コードからテーブルを読み込もうとしているのですが、現在の経験とドキュメントの状態、および見つけることができるサンプル コードの欠如を考えると、これをどのように行うべきかについてはわかりません。これは、私が Google のオンライン コンソールを介して既に入力したテーブルであり、そのオンライン コンソールでシームレスにクエリを実行できます。

BigQuery 用の Google のベータ版 JavaScript ライブラリを使用すると、コードは実際のコードに続くエラー オブジェクトを受け取ります。テーブルを読み取るための呼び出しを実際に発行するために必要なテーブルハンドルの取得に失敗します。テーブルのコンテンツを読み取るために、使用している API 呼び出しに関して、複数の点でコードが間違っていると確信しています。

コード

gapi.client.load('bigquery', 'v2', function() {
    gapi.client.setApiKey('My Key for browser apps here...');
    var request = gapi.client.bigquery.tables.get({'id': 'My-dataset-name.My-table-name'});
    request.execute(function(response) {console.log(response, JSON.stringify(response, null))});
});

結果

{"code":401,"message":"Login Required","data":[{"domain":"global","re​​ason":"required","message":"Login Required","locationType" :"ヘッダー","場所":"承認"}]

API キー (私のダッシュボードに表示されている「ブラウザー アプリのキー」) が、データを読み取るためのアクセスを承認するのに十分であるかどうか、およびtables.getディレクティブに使用する必要がある構文は何かを推測することはできません。これを初めて使用した多数の次元を考えると、髪に火をつけることなく API を使用する方法を見つけることはできないと思います。最後の 2 点の詳細な説明と、実際に動作するサンプル コードは何ですか?

4

3 に答える 3

5

JavaScript用のGoogleAPIクライアントライブラリは、OAuth2.0アクセスおよび更新トークンを保存および使用するクライアント側の承認フローを処理しますジョーダンが述べたように、APIキーを使用してクライアント側からBigQueryにアクセスする方法はありません。JavaScriptアプリケーションはクライアントを非表示に保つことができないため、ユーザーはある時点でAPIへのアクセスを承認する必要があります。

サーバーサイドのユースケースに興味があります。node.jsまたはその他のサーバー側JSフレームワークを使用していますか?ノードツールボックスには、一般的なOAuthノードモジュールがたくさんあります(私は特定の「最良の」モジュールにあまり精通していません)。これらの1つは、JSを介したサーバー側でのトークンの処理を簡素化する可能性があります。

Google APIへのアクセスを承認すると、APIを呼び出すためのアクセストークンが提供されます。GoogleAPIOAuth2.0アクセストークンは1時間持続します。また、更新トークンをリクエストして保存できます。これにより、アクセストークンの有効期限が切れたときに新しいアクセストークンをリクエストできます。

BigQuery認証フローに関するドキュメントから直接取得したクライアント側のJavaScript認証のサンプルを次に示します。

<html>
  <head>
    <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>
    <script>

      function auth() {
        gapi.auth.authorize(config, function() {
            gapi.client.load('bigquery', 'v2');
            $('#client_initiated').html('BigQuery client authorized');
            $('#auth_button').fadeOut();
            $('#dataset_button').fadeIn();
        });
      }

      // User Submitted Variables
      var projectNumber = 'XXXXXXXXXX';
      var clientId = 'XXXXXXXXXX.apps.googleusercontent.com';

      var config = {
        'client_id': clientId,
        'scope': 'https://www.googleapis.com/auth/bigquery'
      };

      function listDatasets() {
        var request = gapi.client.bigquery.datasets.list({
          'projectId':projectNumber
        });
        request.execute(function(response) {
            $('#result_box').html(JSON.stringify(response.result.datasets, null));
        });
      }
    </script>
  </head>

  <body>
    <button id="auth_button" onclick="auth();">Authorize</button>
    <div id="client_initiated"></div>
    <button id="dataset_button" style="display:none;" onclick="listDatasets();">Show datasets</button>
    <div id="result_box"></div>
  </body>
</html>
于 2012-09-19T01:22:38.320 に答える
3

次のサンプルは、 BigQueryにクエリを実行し、 GoogleChartToolsによって生成されたマップに結果を入力するためのHTML/JavaScriptコードです。これを使用するには、プロジェクトIDとクライアントIDで更新し、 APIコンソールにアプリを登録する必要があります。

これは、 https://developers.google.com/bigquery/docs/dataset-natalityに記載されている米国の出生統計(出生率)サンプルデータセットを使用します 。

JavaScript用のGoogleAPIクライアントライブラリを使用して、BigQueryへの承認とAPIリクエストを処理します。

ユーザーは、このページに初めてアクセスするときにOAuth承認フローを介して誘導されます(「config」で定義されたOAuthスコープへのアクセス許可のため)。指定されたプロジェクトの許可されたユーザーである必要があります(プロジェクトの割り当て/請求を実装できるようにするため)。このOAuth承認により、ユーザーが最近承認していない場合はポップアップが表示されますが、以前に承認が付与されている場合は、再度承認を付与する必要はありません。より透過的に実行する必要がある場合は、 「即時モード」を調べることができます。

<html>
<head>
<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>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
  google.load('visualization', '1', {packages: ['geochart']});
</script>
<script>
  // UPDATE TO USE YOUR PROJECT ID AND CLIENT ID
  var project_id = '605902584318';
  var client_id = '605902584318.apps.googleusercontent.com';

  var config = {
    'client_id': client_id,
    'scope': 'https://www.googleapis.com/auth/bigquery'
  };

  function runQuery() {
   var request = gapi.client.bigquery.jobs.query({
      'projectId': project_id,
      'timeoutMs': '30000',
      'query': 'SELECT state, AVG(mother_age) AS theav FROM [publicdata:samples.natality] WHERE year=2000 AND ever_born=1 GROUP BY state ORDER BY theav DESC;'
    });
    request.execute(function(response) {     
        console.log(response);
        var stateValues = [["State", "Age"]];
        $.each(response.result.rows, function(i, item) {
          var state = item.f[0].v;
          var age = parseFloat(item.f[1].v);
          var stateValue = [state, age];
          stateValues.push(stateValue);
        });  
        var data = google.visualization.arrayToDataTable(stateValues);
        var geochart = new google.visualization.GeoChart(
            document.getElementById('map'));
        geochart.draw(data, {width: 556, height: 347, resolution: "provinces", region: "US"});
    });
  }

  function auth() {
    gapi.auth.authorize(config, function() {
        gapi.client.load('bigquery', 'v2', runQuery);
        $('#client_initiated').html('BigQuery client initiated');
    });
    $('#auth_button').hide();
  }
</script>
</head>

<body>
<h2>Average Mother Age at First Birth in 2000</h2>
<button id="auth_button" onclick="auth();">Authorize</button>
<button id="query_button" style="display:none;" onclick="runQuery();">Run Query</button>
<div id="map"></div>
</body>
</html>

注:ユーザーにOAuth承認を行わせずにクエリを割り当て/請求に請求しようとしている場合は、リクエストをAPIにプロキシする単純なサーバー側プロキシを設定する必要があります。サービスアカウントを使用してAppEngineでこれを行うのはかなり簡単です。

于 2012-09-19T01:20:32.963 に答える
0

手短に言えば、認証にはキーが不十分であるということです。OAuth 2.0トークンが必要です。私は JavaScript のユーザーではないので、正確なメカニズムはわかりませんが、これが正しい方向への指針になることを願っています。

于 2012-09-18T15:29:26.650 に答える