Gin框架完全使用指南 | Gin框架多种数据格式响应

公众号:程序员读书,欢迎关注

Gin支持多种数据格式的响应,如:JSON(JSON,SecureJSON,JSONP,AsciiJSON,PureJSON,IndentedJSON),XML,YAML,TOML,ProtoBuf等。

同时也支持返回HTML模板、静态文件或者返回文件系统中的文件,甚至可以把实现了io.Reader接口的对象作为响应。

JSON

除了正常JSON数据格式,Gin还支持多种格式的JSON输出,如SecureJSON,JSONP,AsciiJSON,PureJSON,IndentedJSON。

  • SecureJSON:预防JSON数组劫持。
  • JSONP:与script标签配合使用,可以不受浏览器跨域限制。
  • AsciiJSON:将JSON数据中非ASCII转化为ASCII码。
  • PureJSON:不转换HTML标签。
  • IndentedJSON:对齐输出。
go 复制代码
 package main
 ​
 import (
   "net/http"
 ​
   "github.com/gin-gonic/gin"
 )
 ​
 type User struct {
   Id     int
   Name   string
   Habits []string
 }
 ​
 func main() {
   engine := gin.New()
 ​
   u := User{Id: 1, Name: "小明", Habits: []string{"看书", "看电影"}}
 ​
   engine.GET("/JSON", func(ctx *gin.Context) {
     ctx.JSON(http.StatusOK, u)
   })
 ​
   engine.GET("/JSONP?callback=test", func(ctx *gin.Context) {
     ctx.JSONP(http.StatusOK, u)
   })
 ​
   engine.GET("/AsciiJSON", func(ctx *gin.Context) {
     ctx.AsciiJSON(http.StatusOK, u)
   })
 ​
   engine.GET("/IndentedJSON", func(ctx *gin.Context) {
     ctx.IndentedJSON(http.StatusOK, u)
   })
 ​
   engine.GET("/PureJSON", func(ctx *gin.Context) {
     ctx.PureJSON(http.StatusOK, u)
   })
 ​
   engine.GET("/SecureJSON", func(ctx *gin.Context) {
     data := []int{1, 2, 3, 4}
     ctx.SecureJSON(http.StatusOK, data)
   })
 ​
   engine.Run()
 }

XML

要响应XML格式可以调用gin.Context的xml方法,此时Content-Type为application/xml:

go 复制代码
 package main
 ​
 import (
   "encoding/xml"
 ​
   "github.com/gin-gonic/gin"
 )
 ​
 type User struct {
   XMLName xml.Name `xml:"user"`
   Id      int      `xml:"id"`
   Name    string   `xml:"name"`
   Habits  []string `xml:"habits"`
 }
 ​
 func main() {
 ​
   engine := gin.New()
 ​
   engine.GET("/xml", func(ctx *gin.Context) {
     user := &User{Id: 1, Name: "小明", Habits: []string{"看书", "看电影"}}
     ctx.XML((http.StatusOK, user)
   })
 ​
   engine.Run()
 }

TOML

要响应TOML格式可以调用gin.Context的toml方法,此时Content-Type为application/toml:

go 复制代码
 package main
 ​
 import (
   "net/http"
 ​
   "github.com/gin-gonic/gin"
 )
 ​
 type User struct {
   Id     int
   Name   string
   Habits []string
 }
 ​
 func main() {
 ​
   engine := gin.New()
 ​
   engine.GET("/toml", func(ctx *gin.Context) {
     user := &User{Id: 1, Name: "小明", Habits: []string{"看书", "看电影"}}
     ctx.TOML(http.StatusOK, user)
   })
 ​
   engine.Run()
 }
 ​

YAML

要响应YAML格式可以调用gin.Context的yaml方法,此时Content-Type为application/yaml:

go 复制代码
 package main
 ​
 import (
   "net/http"
 ​
   "github.com/gin-gonic/gin"
 )
 ​
 type User struct {
   Id     int
   Name   string
   Habits []string
 }
 ​
 func main() {
 ​
   engine := gin.New()
 ​
   engine.GET("/yaml", func(ctx *gin.Context) {
     user := &User{Id: 1, Name: "小明", Habits: []string{"看书", "看电影"}}
     ctx.YAML(http.StatusOK, user)
   })
 ​
   engine.Run()
 }

ProtoBuf

要响应ProtoBuf格式的数据,首先要定义proto文件:

ini 复制代码
 syntax = "proto3";
 ​
 option go_package = "./user";
 ​
 message User {
     int64  Id = 1;
     string Name = 2;
     string Email = 3;
 }

定义好proto文件调用protoc命令文件生成pb文件:

注意,运行protoc命令提交安装好protoc和protoc-gen-go

css 复制代码
 $ protoc --proto_path=./ --go_out=./ ./user.proto

执行命令后,此时项目目录结构如下:

go 复制代码
 ├── main.go
 ├── user
 │   └── user.pb.go
 └── user.proto

调用gin.Context的ProtoBuf方法响应数据:

go 复制代码
 package main
 ​
 import (
   "user"
   "github.com/gin-gonic/gin"
 )
 ​
 func main() {
   router := gin.New()
   router.GET("/protoBuf", func(ctx *gin.Context) {
     u := user.User{Id: 1, Name: "protoBuf", Email: "test@163.com"}
     ctx.ProtoBuf(http.StatusOK, &u)
   })
   router.Run()
 }

HTML模板

要响应HTML模板可以调用gin.Context的HTML方法,不过要提前加载模板,假设我们有一个模板名称为templates/index.tmpl,其内容如下:

css 复制代码
<html>
	<h1>
		{{ .title }}
	</h1>
</html>

使用gin.Engine的LoadHTMLFiles()可以加载一个或多个HTML模板:

css 复制代码
package main 

func main() {
	engine := gin.Default()
	engine.LoadHTMLFiles("templates/index.tmpl")
	engine.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.tmpl", gin.H{
			"title": "主页",
		})
	})
	engine.Run()
}

也可以使用gin.Engine的LoadHTMLGlob()加载整个目录的HTML模板:

css 复制代码
package main 

func main() {
	engine := gin.Default()
	engine.LoadHTMLGlob("templates/**/*")
	engine.GET("/index", func(ctx *gin.Context) {
		ctx.HTML(http.StatusOK, "index.tmpl", gin.H{
			"title": "主页",
		})
	})
	engine.Run()
}

静态文件

除了正常响应格式,还可以Static和StaticFile设置静态文件(如js,css等)响应:

arduino 复制代码
├── main.go
└── static
    ├── js
    │   └── index.js
    └── pages
        └── index.html

假设项目目录格式如上所示,此时我们可以按下面代码加载静态文件:

css 复制代码
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	engine := gin.New()
	engine.Static("static/pages", "./static/pages")
	engine.StaticFile("/static/js/index.js", "./static/js/index.js")
	engine.Run()
}

小结

Gin支持多种数据格式响应,我们可以根据自己的需求选择对应的数据格式。

相关推荐
实名上网宋凯宣8 小时前
Django
后端·python·django
我不会起名字3229 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
利威尔xu10 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF11 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
慢云智慧空间11 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu11 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
薛定谔的猫-菜鸟程序员12 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
FungLeo12 小时前
成为全栈·Go 后端篇·从 Node SQLite 到 PostgreSQL:把迁移做成独立交付物
postgresql·golang·sqlite·go·数据库迁移·成为全栈
IT_陈寒13 小时前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端
码事漫谈14 小时前
DeepSeek 搞了个 "Super-agent",但不是超级智能
后端