Gin 框架 JSON 格式返回結(jié)果的使用方式
1.介紹
Gin 框架為 JSON、XML 和 HTML 渲染提供了易用的API。
本文我們主要介紹 JSON 的使用方式。
2.JSON
在 Go 項(xiàng)目開發(fā)中,當(dāng)開發(fā) HTTP API 時(shí),我們通常提供 JSON 格式的返回結(jié)果。
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
}
}
輸出結(jié)果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"ping": "pong"
}
閱讀上面這段代碼,我們可以發(fā)現(xiàn),使用 c.JSON() 方法,即可返回 JSON 格式的返回結(jié)果。
具有轉(zhuǎn)義的非 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
}
}
輸出結(jié)果:
curl -s -X GET http://127.0.0.1:8080
{"ping":"\u003cb\u003epong\u003c/b\u003e"}
閱讀上面這段代碼,我們使用 c.AsciiJSON() 方法,生成有轉(zhuǎn)義的非 ASCII 字符的 ASCII-only JSON。
跨域請(qǐng)求
示例代碼:
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
}
}
輸出結(jié)果:
curl -s -X GET http://127.0.0.1:8080\?callback\=x
x({"ping":"pong"});
閱讀上面這段代碼,我們使用 c.JSONP() 方法,使用 JSONP 向不同域的服務(wù)器請(qǐng)求數(shù)據(jù)。如果查詢參數(shù)存在回調(diào),則將回調(diào)添加到響應(yīng)體中。
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
}
}
輸出結(jié)果:
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
}
}
輸出結(jié)果:
curl -s -X GET http://127.0.0.1:8080
while(1);["lena","austin","foo"]
閱讀上面這段代碼,我們使用 c.SecureJSON() 方法,防止 json 劫持。如果給定的結(jié)構(gòu)是數(shù)組值,則默認(rèn)預(yù)置 "while(1)," 到響應(yīng)體。
我們也可以使用 r.SecureJsonPrefix(")]}',\n") 自定義 SecureJSON 前綴。
3.總結(jié)
本文我們介紹 Gin 框架為 JSON 提供的幾種易于使用的 API。
gin.H 是 map[string]interface{} 的一種快捷方式。
返回結(jié)果也可以使用一個(gè)結(jié)構(gòu)體。
示例代碼:
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
}
}
輸出結(jié)果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"user": "Lena",
"Message": "hey",
"Number": 123
}
閱讀上面這段代碼,我們使用一個(gè)結(jié)構(gòu)體,輸出 JSON 格式的返回結(jié)果。
注意 msg.Name 在 JSON 中變成了 "user",因?yàn)槲覀冊(cè)诮Y(jié)構(gòu)體中定義的 tag 為 json:"user"。