2011-11-18 39 views
1

我正在做一個從Fusion表導入實時數據的系統。C#,Unity3D和Google Fusion Tables - 獲得411響應

我在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); 
    } 
} 

希望任何人都可以幫忙

在此先感謝。

由於凱瑟琳的幫助下,我已經編輯了執行功能如下:

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

代碼編輯迴應凱瑟琳的幫助.. – MCorreia

回答

1

我終於解決了這個問題...

正如我前面所說的,411被退回,因爲該令牌字符串我傳遞給認證頭曾在它新線標籤,所以服務器將其解釋將其作爲POST標題的結尾。刪除字符串末尾的\ n會產生很好的請求。

下一個問題是由於錯誤的查詢,我把錯誤的表ID的錯誤。

感謝凱瑟琳的幫助。

1

試試下面的網址,而不是GET請求(SHOW TABLES可以發送通過GET):

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

POST請求,使用相同的網址...

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

...並在主體中發送sql = [query]。

在兩種情況下,還要確保URL編碼查詢。

+0

謝謝你的回覆...我試過了,但它仍然給我411迴應...任何其他想法? – MCorreia

+0

經過多次搜索後,我發現我的令牌字符串可能在最後有一個\ n換行標誌。所以我刪除了字符串中的最後一個字節。這可能會使服務器認爲標題已結束,並且不會讀取Content-length。現在我從Fusion Tables得到一個500錯誤,說「此時無法執行查詢(看起來是正確的),請重試」是否可以修復? – MCorreia

+0

很高興聽到你想出了問題! :) –

相關問題