Go Web編程–解析JSON請求和生成JSON響應

現在無論是網站、App、小程式還是移動端H5頁面應用,都是採用前端與後端單獨部署,相互之間以API介面交互的形式構建而成的。因為在結合可讀性、編碼數據大小和開發者使用難度上都JSON格式是一個比較好的選擇,所以介面的數據格式通常都採用JSON,即前端在發送POSTPUTPATCH請求添加,更改數據時會把數據以JSON格式放到請求的Body中。而後端則是所有數據都會以JSON格式返回。

關於JSON可讀性、編碼數據大小和開發者使用難度上,因為其可讀性不如XML結構,但是數據量小,用程式操作起來更方便。對比Protobuf來說,Protobuf編碼速度、編碼後數據大小比JSON都要好,但是用程式操作起來沒有JSON方便簡單,編碼後的數據是二進位格式的,易讀性完全沒有。所以整體來說JSON是一個各個方面都不錯更容易被所有人接受才被廣泛使用的(以上都是個人觀點)。

之前也寫過兩篇關於用Go語言解碼和編碼JSON數據的文章

那麼針對Web編程我們其實只要關注怎麼從HTTP請求的Body中讀取到JSON數據,以及如何將要返回給客戶端的數據以JSON格式寫入到HTTP響應中。

從請求體讀取JSON數據

關於這部分內容其實在之前的文章深入學習解析HTTP請求里有說過。

我們需要把請求體作為json.NewDecoder()的輸入流,然後將請求體中攜帶的JSON格式的數據解析到聲明的結構體變數中

//handler/parse_json_request  package handler    import (      "encoding/json"      "fmt"      "net/http"  )    type Person struct {      Name string      Age  int  }    func DisplayPersonHandler(w http.ResponseWriter, r *http.Request) {      var p Person        // 將請求體中的 JSON 數據解析到結構體中      // 發生錯誤,返回400 錯誤碼      err := json.NewDecoder(r.Body).Decode(&p)      if err != nil {          http.Error(w, err.Error(), http.StatusBadRequest)          return      }        fmt.Fprintf(w, "Person: %+v", p)  }    // router/router.go  indexRouter.HandleFunc("/parse_json_request", handler.ParseJsonRequestHandler)  

在命令行里用cURL命令測試我們的程式:

curl -X POST -d '{"name": "James", "age": 18}'        -H "Content-Type: application/json"        http://localhost:8000/index/parse_json_request  

把JSON數據寫入響應

與上面相反,將返回數據以JSON格式寫入響應時,我們調用json.NewEncodeer(w).Encode(&v),用響應體作為輸入流創建JSON編碼器,然後使用其Encode()方法將數據編碼為JSON格式並寫入響應體。

// handler/write_json_response  package handler    import (      "encoding/json"      "net/http"  )    type User struct {      FirstName string `json:"firstname"`      LastName  string `json:"lastname"`      Age       int    `json:"age"`  }    func WriteJsonResponseHandler(w http.ResponseWriter, r *http.Request) {      p := User{          FirstName: "John",          LastName:  "Doe",          Age:       25,      }    // Set response header      w.Header().Set("Content-Type", "application/json")      err := json.NewEncoder(w).Encode(&p)      if err != nil {          //... handle error      }  }    // router/router.go  indexRouter.HandleFunc("/get_json_response", handler.WriteJsonResponseHandler)  

重啟伺服器後在命令行里用cURL命令測試我們的程式:

curl -X GET http://localhost:8000/index/get_json_response  {"firstname":"John","lastname":"Doe","age":25}

今天的內容很簡單,源碼已經上傳,公眾號回復gohttp12獲取文中源程式碼的下載鏈接。