Невозможно внести изменения в Google Fusion Tables (например, вставить, добавить таблицу и т. Д.) - PullRequest
2 голосов
/ 23 января 2012

Я хотел бы написать небольшое расширение Google Chrome, в котором я использую таблицы gooles fusion в качестве центральной базы данных.

Использование существующих таблиц и данных (добавленных через GooleDoc-Webside) работает вполне нормально (SELECT, ПОКАЗАТЬ ТАБЛИЦЫ, ОПИСАТЬ), но если я пытаюсь внести какие-либо изменения (для этого мне нужен запрос "POST").Я всегда получаю следующую ошибку: «Отсутствует параметр sql». Понятия не имею, почему это происходит.Я уже много пробовал (например, «создать таблицу test3 (A: число, B: число)», вставить.)

Код, который я написал, следующий:

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

Если я дляпример попытаться сделать что-то вроде этого

mf.doPOST("INSERT INTO 2664928(ID,Text,Number) VALUES (2,'Hallo',3)",mc)

или этого

mf.doPOST("INSERT INTO 2664928(col4,col0,col1) VALUES (2,'Hallo',3)",mc)

с таблицей, описанной этим

column id,name,type
col4,ID,number
col0,Text,string
col1,Number,number

Я получаю эту ошибку (то же самое, когда я пытаюсь создать таблицу)

Есть предложения?Я действительно смущен!

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Сообщение о «пропущенном параметре sql».похоже, не является настоящей ошибкой.

Когда я правильно понял проблему, в настоящее время невозможно отправить данные в таблицы Fusion с помощью JavaScript .Если GFT отправит соответствующие заголовки CORS для запросов POST, это может сработать.Но на данный момент это не так.

См. Выпуск 554 (http://code.google.com/p/fusion-tables/issues/detail?id=554).

0 голосов
/ 24 января 2012

Попробуйте добавить в запрос заголовок длины содержимого:

var query = "sql="+encodeURI(command);
xmlhttp.setRequestHeader("Content-length", query.length);

Кроме того, я бы рекомендовал отправлять запрос ClientLogin как запрос POST, а не как запрос GET, чтобы имя пользователя и пароль неотправлено как часть URL.

...