Gin 框架 JSON 格式返回结果的使用方式
Gin 框架 JSON 格式返回结果的使用方式
大家好,我是 frank。「Golang语言开发栈」公众号作者。
01
介绍
Gin 框架为 JSON、XML 和 HTML 渲染提供了易用的API。
本文我们主要介绍 JSON 的使用方式。
02
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 前缀。
03
总结
本文我们介绍 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"
。
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2021-11-25 虚拟机挂机引起的docker端口无法访问
2020-11-25 模拟单机故障很有用的文件/proc/sysrq-trigger
2020-11-25 kdump内核崩溃转储服务的使用
2020-11-25 linux定时任务crond那些事!
2019-11-25 Nginx与安全有关的几个配置
2019-11-25 代替ESXI的虚拟机解决方案proxmox
2017-11-25 iptables后,外网访问网站可以,内网无法访问【已解决】