Gin 框架 JSON 格式返回结果的使用方式

Gin 框架 JSON 格式返回结果的使用方式

原创 frank Golang语言开发栈
 

大家好,我是 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"

推荐阅读

  1. Go 语言高性能 Web 框架 Gin 框架路由和请求参数的使用方式
  2. Gin 框架怎么验证绑定到结构体的字段?
  3. Gin 框架怎么使用自定义验证器?
  4. Go 语言泛型使用详解
  5. Go 语言并发编程互斥锁 sync.Mutex 底层实现
Golang语言 · 目录
上一篇Gin 框架怎么使用自定义验证器?
阅读 726
 
posted @   技术颜良  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!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后,外网访问网站可以,内网无法访问【已解决】
点击右上角即可分享
微信分享提示