1. 程式人生 > >介紹 golang json資料的處理

介紹 golang json資料的處理

使用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}