所以我一直在尝试通过此处指定的Google Fusion表API更新融合表:
https://developers.google.com/fusiontables/docs/v1/using#updateRow
我相信我遇到了身份验证问题。我一直在尝试使用OAuth 2.0进行身份验证。
首先是问题所在。这就是我一般在构建这个东西的方式。首先,我使用融合表中的信息填充我想要更新的项目数组:
$(document).ready(function () {
$.ajax({
cache: false,
async: true,
type: "GET",
dataType: "json",
url: "https://www.googleapis.com/fusiontables/v1/query?sql=SELECT ROWID, ThreePartAddress, Latitude, Longitude FROM <table name> WHERE Latitude != '0' AND Longitude != '0' LIMIT 100&key=<key name>",
contentType: "application/json;charset=utf-8",
success: function (m) { if (m != null) { meetings = m; } },
error: function (e) { console.log(e.statusText); }
});
});
meetings变量存储我想要更新的中间表数据。现在我对拉出的地址进行地理编码,然后想要转换它并存储坐标。我使用地理编码api(它只监听前10个请求,这是我完全猜测的另一个问题)。
function ProcessLatLng(geocoder, i, rows) {
geocoder.geocode({ 'address': rows[i][1] },
function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
// fire a query to update our lat lng
rows[i][2] = results[0].geometry.location.lat();
rows[i][3] = results[0].geometry.location.lng();
}
else {
console.log('error geo: ' + status);
}
}
);
}
现在我在这里遇到问题。我下载并在OAuth中获取登录令牌。我从StackOverflow上的另一个问题中提取了这个。它似乎工作但只有一次。我从谷歌获取了我的客户端ID:
var GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/auth";
var GOOGLE_CLIENT_ID = "blahblah.apps.googleusercontent.com";
var PLUS_ME_SCOPE = "https://www.googleapis.com/auth/plus.me";
var button = document.createElement("button");
button.innerText = "Authenticate with Google";
button.onclick = function() {
var req = {
"authUrl" : GOOGLE_AUTH_URL,
"clientId" : GOOGLE_CLIENT_ID,
"scopes" : [ PLUS_ME_SCOPE ],
};
oauth2.login(req, function(token) {
loginToken = token;
}, function(error) {
alert("Error:\n" + error);
});
};
document.body.appendChild(button);
我查看另一个功能的纬度和经度并更新会议。然后我开始循环遍历该数组。我开始构建一个查询来更新表名,然后发出一个POST请求来让这个东西继续下去。
function uploadLatLngs() {
for (row = 1; // first row (0) is column headers
meetings.rows.length > row;
row++) {
var lat = meetings.rows[row][2];
var lng = meetings.rows[row][3];
if (lat != '' && lat != null && lng != '' && lng != null && !(lat == 0 && lng == 0)) {
var data = "?sql=UPDATE <table name> SET Latitude = " + lat + ", Longitude = " + lng + " WHERE ROWID = '" + meetings.rows[row][0] + "'";
var url = "https://www.google.com/fusiontables/v1/query/" + data;
//"&access_token=" + loginToken;
$.ajax({
type: "POST",
contentType: "application/json",
url: url,
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + loginToken);
},
success: function run(data) { console.log(data); }
});
}
}
}
当我开始触发这些请求时,每次都会收到CORS访问错误。
OPTIONS https://www.google.com/fusiontables/v1/query/?sql=UPDATE%<Table name>,%20Longitude%20=%20-77.09161899999998%20WHERE%20ROWID%20=%20%2725%27 405 (Method Not Allowed) jquery-1.4.2.min.js:128
OPTIONS https://www.google.com/fusiontables/v1/query/?sql=UPDATE%20<table name>,%20Longitude%20=%20-77.09161899999998%20WHERE%20ROWID%20=%20%2725%27 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:53104' is therefore not allowed access.
我曾经只见过这项工作,如果我使用:https://developers.google.com/oauthplayground/生成访问令牌,似乎只会发生这种情况。我似乎无法使用我自己的客户端ID。
我在这里缺少什么?这是我的谷歌开发者控制台的“某种”视图:
Client ID for web application
Client ID XXXX
Email address XXX
Client secret XXXX
Redirect URIs http://localhost:53104/GoogleMapsTest/Testing/oauthWindow.html
Javascript Origins http://localhost:53104
oauthWindow是我正在授权的窗口