我是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而不会让我的头发着火.最后两点的详细解释是什么,以及样本代码的工作原理是什么?
用于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>
Run Code Online (Sandbox Code Playgroud)
以下示例是用于查询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 上执行此操作相当简单。