Impossible de faire des modifications sur Google Fusion Tables (comme insérer, ajouter une table, etc.)
-
12-11-2019 - |
Question
Je voudrais écrire une petite extension Google Chrome dans laquelle j'utilise des tables de fusion Gooles comme base de données centrale.
L'utilisation de tables et de données existantes (ajoutées via le gooledoc-webside) fonctionne très bien (sélectionnez, affichez les tables, décrivez) mais si j'essaie de modifier (pour cela, j'ai besoin d'une demande "post"). J'obtiens toujours l'erreur suivante: "Paramètre SQL manquant." Je ne sais pas pourquoi cela se produit. J'ai déjà essayé beaucoup (par exemple "Créer Table Test3 (A: Number, B: Number)", INSERT.)
Le code que j'ai écrit est les suivants:
function Fusion(readyCallback) {
var myObject = {
URL : "https://www.google.com/fusiontables/api/query",
authToken : null,
doGET : function(command,callback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get"
,this.URL+"?sql="+encodeURI(command)
,true);
xmlhttp.setRequestHeader("Authorization"
,"GoogleLogin auth=" + this.authToken);
xmlhttp.onreadystatechange = function() { callback(xmlhttp.responseText); }
xmlhttp.send();
},
doPOST : function(command,callback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("post"
,this.URL
,true);
xmlhttp.setRequestHeader("Authorization"
,"GoogleLogin auth=" + this.authToken);
xmlhttp.onreadystatechange = function() { callback(xmlhttp.responseText); }
xmlhttp.send("sql="+encodeURI(command));
}
}
// client login authentification
var email = "XXX@gmail.com";
var password = "XXX";
var loginURL = "https://www.google.com/accounts/ClientLogin?accountType=GOOGLE&Email="
+ encodeURI(email) + "&Passwd=" + encodeURIComponent(password)
+ "&service=fusiontables&Source=testing";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get",loginURL,true);
xmlhttp.onreadystatechange = function() {
var tmp = xmlhttp.responseText;
tmp = tmp.slice(tmp.search("Auth=") + 5, tmp.length);
tmp = tmp.replace(/\n/g, "");
tmp = tmp.replace(/\r/g, "");
myObject.authToken = tmp;
console.log("authentifiaction token status: "+xmlhttp.statusText);
if (readyCallback) {
readyCallback();
}
};
xmlhttp.send();
return myObject;
}
Si j'essaye par exemple de faire quelque chose comme ça
mf.doPOST("INSERT INTO 2664928(ID,Text,Number) VALUES (2,'Hallo',3)",mc)
ou ca
mf.doPOST("INSERT INTO 2664928(col4,col0,col1) VALUES (2,'Hallo',3)",mc)
avec une table, décrite par ce
column id,name,type
col4,ID,number
col0,Text,string
col1,Number,number
Je continue à obtenir cette erreur (la même chose lorsque j'essaie de créer un tableau)
Aucune suggestion? Je suis vraiment confus!
La solution
Le message sur le «paramètre SQL manquant». Cela ne semble pas être la véritable erreur.
Quand j'ai bien compris le problème, Il n'est actuellement pas possible de publier des données sur des tables de fusion en utilisant JavaScript. Si GFT envoyait des en-têtes CORS appropriés pour les demandes de poste, cela pourrait réellement fonctionner. Mais ce n'est pas le cas pour l'instant.
Voir le numéro 554 (http://code.google.com/p/fusion-tables/issues/detail?id=554).
Autres conseils
Essayez d'ajouter un en-tête de longueur de contenu à la demande:
var query = "sql="+encodeURI(command);
xmlhttp.setRequestHeader("Content-length", query.length);
De plus, je recommanderais d'envoyer la demande ClientLogin en tant que demande de poste plutôt que la demande GET, afin que le nom d'utilisateur et le mot de passe ne soient pas envoyés dans le cadre de l'URL.