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获取文中源代码的下载链接。