Таблицы C #, Unity3D и Google Fusion - получение ответа 411 - PullRequest
1 голос
/ 19 ноября 2011

Я работаю с системой, которая импортирует живые данные из таблиц Fusion.

Я использую C # в Unity3D, поэтому у меня нет WebRequest из .NET Framework.

Однако,Unity3D имеет WWW и WWWForm, и я пытаюсь использовать их для запроса таблиц Fusion.У меня уже есть токен аутентификации, но API-интерфейс SQL-инъекции возвращает страницу 411, запрашивающую Content-Length.

Я уже добавил это в заголовки, но все равно без изменений ...

Ниже я отправляю код для теста запроса, он предполагает действительную аутентификацию в таблицах Fusion

public string Execute(string query) {

    string result;

    var url_fusion_tables = "https://tables.googlelabs.com/api/query/?";

    WWWForm postdata = new WWWForm();

    System.Collections.Hashtable headers = postdata.headers;

    headers["Method"] = "POST";
    headers["Content-Type"] = "applicaton/x-www-form-urlencoded";

    string header_token = string.Format("GoogleLogin auth = {0}", token);
    headers["Authorization"] = header_token;

    var sb = new StringBuilder();
    sb.Append("sql=");
    sb.Append(WWW.EscapeURL("SHOW TABLES"));

    var data = Encoding.ASCII.GetBytes(sb.ToString());
    headers["Content-Length"] = data.Length;

    WWW reqClient = new WWW(url_fusion_tables, data, headers);

    StartCoroutine(WaitForQuery(reqClient));

    return null;

}

IEnumerator WaitForQuery(WWW www) {

    yield return www;

    if (www.error == null) {

        //Debug.Log("Success");
        Debug.Log("Received :: " + www.text);


    } else {
        Debug.Log("Query WWW error : "+ www.error);
    }
}

Надеюсь, что кто-нибудь может помочь.

Заранее спасибо.

Благодаря помощи Кэтрин я отредактировал функцию Execute следующим образом:

    public void Execute(string query) {
    //in query : SHOW TABLES

    var sql = string.Format("sql={0}", WWW.EscapeURL(query));
    var url_fusion_tables = "https://www.google.com/fusiontables/api/query?";

    WWWForm postdata = new WWWForm();


    System.Collections.Hashtable headers = postdata.headers;

    headers["AllowAutoRedirect"] = true;
    headers["AllowWriteStreamBuffering "] = true;
    headers["Method"] = "GET";
    headers["Content-Type"] = "applicaton/x-www-form-urlencoded";

    string header_token = string.Format("GoogleLogin auth = {0}", token);
    headers["Authorization"] = header_token;

    var data = Encoding.ASCII.GetBytes(sql);
    headers["Content-Length"] = data.Length;

    WWW reqClient = new WWW(url_fusion_tables, data, headers);

    StartCoroutine(WaitForQuery(reqClient));

}

IЯ все еще получаю 411 ответ

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Я наконец решил проблему ...

Как я уже говорил, 411 был возвращен, потому что строка токена, которую я передал заголовку аутентификации, содержала тег новая строка ,поэтому сервер будет интерпретировать это как конец заголовка на POST.Удаление \ n в конце строки приводит к хорошему запросу.

Следующая проблема возникла из-за неверного запроса, моей ошибки при вводе неверного идентификатора таблицы.

Спасибо Кэтрин заваша помощь.

1 голос
/ 19 ноября 2011

Попробуйте использовать следующий URL для запросов GET (ПОКАЗАТЬ ТАБЛИЦЫ можно отправить через GET):

https://www.google.com/fusiontables/api/query?sql=[query]

Для запросов POST используйте тот же URL ...

https://www.google.com/fusiontables/api/query

... и отправьте sql = [запрос] в теле.

Также убедитесь, что URL кодирует запрос в обоих случаях.

...