2013-01-19 48 views
1

我試圖從應用程序的Javascript前端向使用Go的App Engine發送JSON格式的請求。我如何解析處理程序中的結構請求?在Google App Engine中使用JSON請求(使用Go編程語言)

說,例如我的請求是與該請求有效載荷

{'Param1':'Value1'} 

一個POST和我的結構是

type Message struct { 
    Param1 string 
    }          

和可變

var m Message        

在應用程序引擎的示例文檔使用FormValue函數獲取標準請求值,這似乎不起作用當你使用json。

一個簡單的例子將不勝感激。

回答

1

您可以在表單字段中發送數據,但通常您只需從response.Body中讀取數據。這裏有一個最小的jQuery & App Engine的例子:

package app 

import (
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
    "net/http" 
    "strings" 
) 

func init() { 
    http.HandleFunc("/", home) 
    http.HandleFunc("/target", target) 
} 

const homePage = 
`<!DOCTYPE html> 
<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
</head> 
<body> 
    <form action="/target" id="postToGoHandler"> 
    <input type="submit" value="Post" /> 
    </form> 
    <div id="result"></div> 
<script> 
$("#postToGoHandler").submit(function(event) { 
    event.preventDefault(); 
    $.post("/target", JSON.stringify({"Param1": "Value1"}), 
     function(data) { 
      $("#result").empty().append(data); 
     } 
    ); 
}); 
</script> 
</body> 
</html>` 

func home(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, homePage) 
} 

type Message struct { 
    Param1 string 
} 

func target(w http.ResponseWriter, r *http.Request) { 
    defer r.Body.Close() 
    if body, err := ioutil.ReadAll(r.Body); err != nil { 
     fmt.Fprintf(w, "Couldn't read request body: %s", err) 
    } else { 
     dec := json.NewDecoder(strings.NewReader(string(body))) 
     var m Message 
     if err := dec.Decode(&m); err != nil { 
      fmt.Fprintf(w, "Couldn't decode JSON: %s", err) 
     } else { 
      fmt.Fprintf(w, "Value of Param1 is: %s", m.Param1) 
     } 
    } 
} 
4

的官方文檔是相當不錯的,請參閱:

http://golang.org/doc/articles/json_and_go.html

它例子都爲編碼/解碼到一個已知的結構(您的例子),但也說明了如何使用反射,類似於做到如何使用更通俗的語言進行操作。

+0

我的問題是,我不知道該請求的一部分(類型* http.Request)傳遞到解碼功能(這需要一個io.Reader作爲輸入)。 – Daniel

+0

對於POST請求,請使用響應主體。這應該包含「原始」JSON數據(簡單地說就是一個JSON編碼的數據結構,它是一個簡單的字符串)。 –

+0

它實際上取決於服務器,它是如何發回JSON數據的。它通常使用響應主體來完成。 –

相關問題