我正在做一个从Fusion表导入实时数据的系统。
我在Unity3D中使用C#,因此我没有.NET框架中的WebRequest。
然而,Unity3D有WWW和WWWForm,我正在尝试使用它们来查询Fusion Tables。 我已经拥有身份验证令牌,但SQL注入API返回411页请求Content-Length。
我已经将它添加到标题中,但仍然没有变化......
Bellow我发布了查询测试的代码,它假设在Fusion Tables中进行有效的身份验证
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);
}
}
希望任何人都可以提供帮助。
提前致谢。
由于Kathryn的帮助,我已将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));
}
我仍然收到411回复
答案 0 :(得分:1)
尝试使用以下URL代替GET请求(可以通过GET发送SHOW TABLES):
https://www.google.com/fusiontables/api/query?sql= [查询]
对于POST请求,请使用相同的URL ...
https://www.google.com/fusiontables/api/query
...并在正文中发送sql = [query]。
同时确保在两种情况下对查询进行URL编码。
答案 1 :(得分:1)
我终于解决了这个问题...
正如我之前所说,返回了411,因为传递给身份验证头的令牌字符串中有一个新行标记,因此服务器会将其解释为Header的结尾POST。删除字符串末尾的\ n会产生良好的请求。
下一个问题是由于查询错误,我错误地输入了错误的表ID。
感谢Kathryn的帮助。