Я работаю с системой, которая импортирует живые данные из таблиц 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 ответ