1

我正在做一个从 Fusion 表中导入实时数据的系统。

我在 Unity3D 中使用 C#,所以我没有来自 .NET 框架的 WebRequest。

但是,Unity3D 有 WWW 和 WWWForm,我正在尝试使用它们来查询 Fusion Tables。我已经有了身份验证令牌,但 SQL 注入 API 返回一个请求 Content-Length 的 411 页面。

我已经将它添加到标题中,但仍然没有改变......

贝娄我发布了查询测试的代码,它假设在 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 回复

4

2 回答 2

1

尝试使用以下 URL 代替 GET 请求(SHOW TABLES 可以通过 GET 发送):

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

对于 POST 请求,使用相同的 URL...

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

...并在正文中发送 sql=[query] 。

还要确保在这两种情况下都对查询进行 URL 编码。

于 2011-11-19T00:33:29.490 回答
1

我终于解决了这个问题...

正如我之前所说,返回 411 是因为我传递给身份验证标头的令牌字符串中有一个新行标签,因此服务器会将其解释为 POST 标头的结尾。删除字符串末尾的 \n 会产生良好的请求。

下一个问题是由于错误的查询,我错误地放置了错误的表 ID。

感谢凯瑟琳的帮助。

于 2011-11-20T00:36:39.640 回答