从JavaScript代码中获取BigQuery数据

mat*_*ter 6 google-bigquery

我是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))});
});
Run Code Online (Sandbox Code Playgroud)

结果

{"code":401,"message":"需要登录","数据":[{"domain":"global","reason":"required","message":"Login Required","locationType" : "头", "位置": "授权"}]

我没有推断出API密钥(我的仪表板中显示的"浏览器应用程序密钥")是否足以授权读取数据的访问权限,以及该tables.get指令应该使用的语法是什么.鉴于第一次使用这个尺寸的大量尺寸,我怀疑我会发现如何使用API​​而不会让我的头发着火.最后两点的详细解释是什么,以及样本代码的工作原理是什么?

Mic*_*hri 5

用于JavaScriptGoogle 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>
Run Code Online (Sandbox Code Playgroud)


Rya*_*oyd 4

以下示例是用于查询BigQuery并将结果填充到由Google 图表工具生成的地图中的 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>
Run Code Online (Sandbox Code Playgroud)

注意:如果您尝试在不让用户通过 OAuth 授权的情况下将查询记入您的配额/账单,则您需要设置一个简单的服务器端代理来代理您对 API 的请求。使用服务帐户在 App Engine 上执行此操作相当简单。