1.介绍
Gin 框架为 JSON、XML 和 HTML 渲染提供了易用的API。
本文我们主要介绍 JSON 的使用方式。
2.JSON
在 Go 项目开发中,当开发 HTTP API 时,我们通常提供 JSON 格式的返回结果。
Go 框架为 JSON 渲染提供了易用的 API。
普通 JSON
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"ping": "pong",
})
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"ping": "pong"
}
阅读上面这段代码,我们可以发现,使用 c.JSON() 方法,即可返回 JSON 格式的返回结果。
具有转义的非 ASCII 字符的 ASCII-only JSON
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.AsciiJSON(200, gin.H{
"ping": "<b>pong</b>",
})
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080
{"ping":"\u003cb\u003epong\u003c/b\u003e"}
阅读上面这段代码,我们使用 c.AsciiJSON() 方法,生成有转义的非 ASCII 字符的 ASCII-only JSON。
跨域请求
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSONP(200, gin.H{
"ping": "pong",
})
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080\?callback\=x
x({"ping":"pong"});
阅读上面这段代码,我们使用 c.JSONP() 方法,使用 JSONP 向不同域的服务器请求数据。如果查询参数存在回调,则将回调添加到响应体中。
PureJSON
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.PureJSON(200, gin.H{
"ping": "<b>pong</b>",
})
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"ping": "<b>pong</b>"
}
阅读上面这段代码,我们使用 c.PureJSON() 方法,输出字面字符。
SecureJSON
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
names := []string{"lena", "austin", "foo"}
c.SecureJSON(200, names)
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080
while(1);["lena","austin","foo"]
阅读上面这段代码,我们使用 c.SecureJSON() 方法,防止 json 劫持。如果给定的结构是数组值,则默认预置 "while(1)," 到响应体。
我们也可以使用 r.SecureJsonPrefix(")]}',\n") 自定义 SecureJSON 前缀。
3.总结
本文我们介绍 Gin 框架为 JSON 提供的几种易于使用的 API。
gin.H 是 map[string]interface{} 的一种快捷方式。
返回结果也可以使用一个结构体。
示例代码:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
var msg struct {
Name string `json:"user"`
Message string
Number int
}
msg.Name = "Lena"
msg.Message = "hey"
msg.Number = 123
c.JSON(http.StatusOK, msg)
})
err := r.Run()
if err != nil {
return
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"user": "Lena",
"Message": "hey",
"Number": 123
}
阅读上面这段代码,我们使用一个结构体,输出 JSON 格式的返回结果。
注意 msg.Name 在 JSON 中变成了 "user",因为我们在结构体中定义的 tag 为 json:"user"。