C#,Unity3D和Google Fusion表-得到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;

我正在做一个从融合表导入实时数据的系统

我在Unity3D中使用C#,所以我没有.NET framework的WebRequest

然而,Unity3D有WWW和WWWForm,我正试图使用它们来查询融合表。 我已经有了身份验证令牌,但是SQL注入API返回了411页,请求内容长度

我已经将其添加到标题中,但仍然没有更改

下面我发布查询测试的代码,它假定在融合表中进行有效的身份验证

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错误,它说“此时无法执行查询(看起来是正确的)。请重试”这是否可以修复?