如今不管是網站、App
、小程序仍是移動端H5
頁面應用,都是採用前端與後端單獨部署,相互之間以API
接口交互的形式構建而成的。由於在結合可讀性、編碼數據大小和開發者使用難度上都JSON
格式是一個比較好的選擇,因此接口的數據格式一般都採用JSON
,即前端在發送POST
,PUT
,PATCH
請求添加,更改數據時會把數據以JSON
格式放到請求的Body
中。然後端則是全部數據都會以JSON
格式返回。前端
關於JSON
可讀性、編碼數據大小和開發者使用難度上,由於其可讀性不如XML
結構,可是數據量小,用程序操做起來更方便。對比Protobuf
來講,Protobuf
編碼速度、編碼後數據大小比JSON
都要好,可是用程序操做起來沒有JSON
方便簡單,編碼後的數據是二進制格式的,易讀性徹底沒有。因此總體來講JSON
是一個各個方面都不錯更容易被全部人接受才被普遍使用的(以上都是我的觀點)。shell
以前也寫過兩篇關於用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.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獲取文中源代碼的下載連接。學習
前文回顧