Получение данных BigQuery из кода JavaScript

Я новичок в BigQuery (и фактически использовать Google API вообще). Пытаясь прочитать таблицу из кода JavaScript, я не знаю, как это должно быть выполнено, учитывая мой текущий опыт и состояние документации и отсутствие образца кода, который я мог бы найти. Это таблица, которую я уже заполнял через онлайн-консоль Google, и ее можно легко запросить там в этой онлайн-консоли.

использование бета-библиотеки JavaScript Google для BigQuery, мой код получает объект ошибки, который следует за моим фактическим кодом. Это не удается получить дескриптор таблицы, который требуется в моем понимании для фактического вызова для чтения таблицы. Я уверен, что мой код неверен более чем одним способом с точки зрения того, какие вызовы 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))});
});

результат

{"код":401,"сообщение":"вход Required","data": [{"domain": "global","reason":"required","message":"требуется логин","locationType":"header","location": "Authorization"}]

мне не хватает вывода, достаточно ли ключа API ("ключ для приложений браузера", как показано на моей панели мониторинга) для авторизации доступа для чтения данных, а также какой синтаксис следует использовать для

3 ответов


следующий пример-код HTML / JavaScript для запроса BigQuery, и заполнение результата в карте, порожденный Инструменты Google Chart. Вам нужно обновить свой идентификатор проекта и идентификатор клиента-и зарегистрировать приложение в консоли API для того, чтобы использовать это.

это использует набор данных образца статистики рождения (natality) США документированный здесь: https://developers.google.com/bigquery/docs/dataset-natality

использует клиентская библиотека Google APIs для JavaScript для обработки запросов авторизации и API к BigQuery.

пользователь будет направлен через поток утверждения OAuth при первом доступе к этой странице (для разрешения области OAuth, определенной в "config"). Они должны быть авторизованным пользователем указанного проекта (поэтому квота/биллинг проекта могут быть выполненный.) Эта авторизация 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 с учетными записями службы.


на клиентская библиотека Google APIs для JavaScript ручки на стороне клиента поток авторизации хранения и использования токенов доступа и обновления OAuth 2.0. Как упоминал Джордан, нет способа использовать ключ API для доступа к BigQuery со стороны клиента-поскольку приложение JavaScript не сможет сохранить секрет клиента скрытым, пользователь должен авторизовать доступ к API в какой - то момент.

меня интересует ваш серверный вариант использования. Вы использование node.JS или какая-то другая серверная JS-платформа? Есть куча общие модули узла OAuth at Node toolbox (я не очень хорошо знаком с каким-либо конкретным "лучшим" модулем). Один из них может упростить обработку токена на стороне сервера через JS.

когда вы разрешаете доступ к API Google, вам предоставляется маркер доступа для совершения вызовов API - Google API OAuth 2.0 маркеры доступа длятся в течение одного часа. Кроме того, вы можете запросить и сохранить маркер обновления, что позволит вам запросить новый токен доступа, когда токен доступа истечет.

вот пример авторизации JavaScript на стороне клиента, извлеченной непосредственно из наша документация о потоках авторизации BigQuery:

<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>

короткий ответ заключается в том, что ключа недостаточно для авторизации. Вам понадобится OAuth 2.0 маркер. Я не Пользователь JavaScript, поэтому я не знаю точного механизма, но, надеюсь, это даст вам указатель в правильном направлении.