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

如今不管是網站、App、小程序仍是移動端H5頁面應用,都是採用前端與後端單獨部署,相互之間以API接口交互的形式構建而成的。由於在結合可讀性、編碼數據大小和開發者使用難度上都JSON格式是一個比較好的選擇,因此接口的數據格式一般都採用JSON,即前端在發送POSTPUTPATCH請求添加,更改數據時會把數據以JSON格式放到請求的Body中。然後端則是全部數據都會以JSON格式返回。前端

關於JSON可讀性、編碼數據大小和開發者使用難度上,由於其可讀性不如XML結構,可是數據量小,用程序操做起來更方便。對比Protobuf來講,Protobuf編碼速度、編碼後數據大小比JSON都要好,可是用程序操做起來沒有JSON方便簡單,編碼後的數據是二進制格式的,易讀性徹底沒有。因此總體來講JSON是一個各個方面都不錯更容易被全部人接受才被普遍使用的(以上都是我的觀點)。shell

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

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

從請求體讀取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格式並寫入響應體。app

// 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

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

今天的內容很簡單,源碼已經上傳,公衆號回覆gohttp12獲取文中源代碼的下載連接。學習

前文回顧

深刻學習用Go編寫HTTP服務器

Go Web編程--應用ORM

Go Web 編程--超詳細的模板庫應用指南

Go Web編程--使用Go語言建立靜態文件服務器

Go Web編程--給本身寫的服務器添加錯誤和訪問日誌

第1頁.png

相關文章
相關標籤/搜索