介紹 golang json資料的處理
阿新 • • 發佈:2018-11-04
使用golang下的net/http模組,可以很容易的實現webserver功能。本篇就結合http模組在POST傳送josn資料給webserver以及webserver在收到json資料後如何處理。
一、server端處理json資料
server端程式碼如下:
package main import ( "net/http" "fmt" "log" "encoding/json" ) type User struct{ Id string Balance uint64 } func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { var u User if r.Body == nil { http.Error(w, "Please send a request body", 400) return } err := json.NewDecoder(r.Body).Decode(&u) if err != nil { http.Error(w, err.Error(), 400) return } fmt.Println(u.Id) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
通過go run server.go執行後,可以通過curl 命令進行測試:
curl http://127.0.0.1:8080 -d '{"Id": "www.361way.com", "Balance": 8}'
通過curl命令執行後,在server端螢幕上能正常列印www.361way.com就表示server端已正常處理json資料。
二、client端的json post處理
client端實現的功能就是上面curl命令執行實現的功能,其程式碼如下:
package main import ( "net/http" "encoding/json" "io" "os" "bytes" ) type User struct{ Id string Balance uint64 } func main() { u := User{Id: "www.361way.com", Balance: 8} b := new(bytes.Buffer) json.NewEncoder(b).Encode(u) res, _ := http.Post("http://127.0.0.1:8080", "application/json; charset=utf-8", b) io.Copy(os.Stdout, res.Body) }
三、服務端返回json資料
避免可能描述的歧義,這裡用英文描述為“Encoding JSON in a server response”,即通過伺服器處理後,將json資料返回給客戶端
package main import ( "net/http" "log" "encoding/json" ) type User struct{ Id string Balance uint64 } func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { u := User{Id: "www.361way.com", Balance: 8} json.NewEncoder(w).Encode(u) }) log.Fatal(http.ListenAndServe(":8080", nil)) }
通過curl http://127.0.0.1:8080 其會返回{Id: "www.361way.com", Balance: 8}資料給客戶端。
四、返回響應頭資訊
在向服務端傳送資料後,有時我們需要獲取響應頭的資訊,可以通過如下程式碼處理:
package main import ( "net/http" "encoding/json" "bytes" "fmt" ) type User struct{ Id string Balance uint64 } func main() { u := User{Id: "www.361way.com", Balance: 8} b := new(bytes.Buffer) json.NewEncoder(b).Encode(u) res, _ := http.Post("https://httpbin.org/post", "application/json; charset=utf-8", b) var body struct { //sends back key/value pairs, no map[string][]string Headers map[string]string `json:"headers"` Origin string `json:"origin"` } json.NewDecoder(res.Body).Decode(&body) fmt.Println(body) }
以上程式碼在向httpbin.org post資料後,會得到如下響應資訊:
{map[Content-Length:36 Content-Type:application/json; charset=utf-8 Host:httpbin.org User-Agent:Go-http-client/1.1 Accept-Encoding:gzip Connection:close] 115.28.174.118}