6

我是BigQuery的新手(以及实际使用 Google API 的任何东西)。尝试从 JavaScript 代码中读取表格时,鉴于我目前的经验和文档状态以及缺少可以找到的示例代码,我不知道应该如何完成。这是我已经通过 Google 的在线控制台填充的表格,并且可以在该在线控制台中无缝查询。

使用 Google 的 BigQuery 测试版 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":"需要登录","data":[{"domain":"global","re​​ason":"required","message":"需要登录","locationType" :"header","location":"授权"}]

我没有推断出 API 密钥(在我的仪表板中显示的“浏览器应用程序的密钥”)是否足以授权访问以读取数据,以及该tables.get指令应使用的语法是什么。鉴于第一次使用它的众多维度,我怀疑我是否会找到如何使用 API 而不会让我的头发着火。最后两点的详细解释是什么,工作示例代码是什么?

4

3 回答 3

5

适用于 JavaScript的Google API 客户端库处理存储和使用 OAuth 2.0 访问和刷新令牌的客户端授权流程。正如 Jordan 所提到的,无法使用 API 密钥从客户端访问 BigQuery——因为 JavaScript 应用程序无法隐藏客户端机密,用户必须在某个时候授权访问 API。

我对您的服务器端用例感兴趣。您使用的是 node.js 还是其他一些服务器端 JS 框架?节点工具箱中有一堆通用的 OAuth 节点模块(我对任何特定的“最佳”模块都不是很熟悉)。其中之一可能会简化通过 JS 在服务器端处理令牌的过程。

当您授权访问 Google API 时,系统会为您提供一个用于调用 API 的访问令牌 - Google API OAuth 2.0 访问令牌持续一小时。并且,您可以请求和存储刷新令牌,这将允许您在访问令牌过期时请求新的访问令牌。

以下是直接从我们有关 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并将结果填充到由Google Chart Tools生成的地图中的 HTML/JavaScript 代码。您需要使用您的项目 ID 和客户端 ID 进行更新——并在API 控制台中注册您的应用程序才能使用它。

这使用此处记录的美国出生统计(出生)样本数据集: https ://developers.google.com/bigquery/docs/dataset-natality

它使用适用于 JavaScript 的 Google API 客户端库来处理对 BigQuery 的授权和 API 请求。

用户首次访问此页面时将被引导通过 OAuth 批准流程(以获得对“配置”中定义的 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 的请求。使用服务帐户在 App Engine 上执行此操作相当简单。

于 2012-09-19T01:20:32.963 回答
0

简短的回答是密钥不足以授权。您需要一个OAuth 2.0令牌。我不是 JavaScript 用户,所以我不知道确切的机制,但希望这会给你一个正确方向的指针。

于 2012-09-18T15:29:26.650 回答