C#,Unity3D和Google Fusion表-得到411个响应
我正在做一个从融合表导入实时数据的系统 我在Unity3D中使用C#,所以我没有.NET framework的WebRequest 然而,Unity3D有WWW和WWWForm,我正试图使用它们来查询融合表。 我已经有了身份验证令牌,但是SQL注入API返回了411页,请求内容长度 我已经将其添加到标题中,但仍然没有更改 下面我发布查询测试的代码,它假定在融合表中进行有效的身份验证C#,Unity3D和Google Fusion表-得到411个响应,c#,unity3d,google-fusion-tables,C#,Unity3d,Google Fusion Tables,我正在做一个从融合表导入实时数据的系统 我在Unity3D中使用C#,所以我没有.NET framework的WebRequest 然而,Unity3D有WWW和WWWForm,我正试图使用它们来查询融合表。 我已经有了身份验证令牌,但是SQL注入API返回了411页,请求内容长度 我已经将其添加到标题中,但仍然没有更改 下面我发布查询测试的代码,它假定在融合表中进行有效的身份验证 public string Execute(string query) { string result;
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个响应请尝试以下URL,而不是GET请求(显示表格可以通过GET发送): https://www.google.com/fusiontables/api/query?sql=[查询] 对于POST请求,请使用相同的URL …并在正文中发送sql=[query]
还要确保在这两种情况下都对查询进行URL编码。我终于解决了这个问题 正如我前面所说的,411被返回是因为我传递给身份验证头的令牌字符串中有一个新行标记,所以服务器会将其解释为POST头的结尾。删除字符串末尾的\n将导致良好的请求 下一个问题是由于一个错误的查询,即我错误地输入了错误的表ID
谢谢凯瑟琳的帮助。谢谢你的回复。。。我试过了,但还是得到了411的回复。。。还有其他想法吗?在搜索了一些之后,我发现我的令牌字符串的末尾可能有一个\n换行标志。所以我从字符串中删除了最后一个字节。这可能会使服务器认为头已经结束,并且不会读取内容长度。现在我从Fusion表中得到一个500错误,它说“此时无法执行查询(看起来是正确的)。请重试”这是否可以修复?