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

私はついに問題を解決しました...

前に述べたように、認証ヘッダーに渡したトークン文字列に新しい行タグが含まれているため、411が返されました。そのため、サーバーはそれをPOSTのヘッダーの終わりとして解釈します。文字列の最後にある\nを削除すると、適切なリクエストが生成されます。

次の問題は、クエリの誤り、間違ったテーブルIDの入力の間違いによるものでした。

キャスリン、助けてくれてありがとう。

于 2011-11-20T00:36:39.640 に答える
1

GET リクエストの代わりに次の URL を試してください (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 に答える