Go Web 编程--解析 JSON 请求和生成 JSON 响应
现在无论是网站、App
、小程序还是移动端 H5
页面应用,都是采用前端与后端单独部署,相互之间以 API
接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都 JSON
格式是一个比较好的选择,所以接口的数据格式通常都采用 JSON
,即前端在发送 POST
,PUT
,PATCH
请求添加,更改数据时会把数据以 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 获取文中源代码的下载链接。
前文回顾
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: