内容简介:现在无论是网站、关于之前也写过两篇关于用
现在无论是网站、 App 、小程序还是移动端 H5 页面应用,都是采用前端与后端单独部署,相互之间以 API 接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都 JSON 格式是一个比较好的选择,所以接口的数据格式通常都采用 JSON ,即前端在发送 POST , PUT , PATCH 请求添加,更改数据时会把数据以 JSON 格式放到请求的 Body 中。而后端则是所有数据都会以 JSON 格式返回。
关于 JSON 可读性、编码数据大小和开发者使用难度上,因为其可读性不如 XML 结构,但是数据量小,用程序操作起来更方便。对比 Protobuf 来说, Protobuf 编码速度、编码后数据大小比 JSON 都要好,但是用程序操作起来没有 JSON 方便简单,编码后的数据是二进制格式的,易读性完全没有。所以整体来说 JSON 是一个各个方面都不错更容易被所有人接受才被广泛使用的(以上都是个人观点)。
之前也写过两篇关于用 Go 语言解码和编码 JSON 数据的文章
- 如何控制 Go 编码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获取文中源代码的下载链接。
前文回顾
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。