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

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

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

同时也支持返回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.Contextxml方法,此时Content-Typeapplication/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.Contexttoml方法,此时Content-Typeapplication/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.Contextyaml方法,此时Content-Typeapplication/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命令提交安装好protocprotoc-gen-go

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

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

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

调用gin.ContextProtoBuf方法响应数据:

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.ContextHTML方法,不过要提前加载模板,假设我们有一个模板名称为templates/index.tmpl,其内容如下:

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

使用gin.EngineLoadHTMLFiles()可以加载一个或多个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.EngineLoadHTMLGlob()加载整个目录的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()
}

静态文件

除了正常响应格式,还可以StaticStaticFile设置静态文件(如jscss等)响应:

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支持多种数据格式响应,我们可以根据自己的需求选择对应的数据格式。

相关推荐
哎呦没30 分钟前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch1 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码2 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries3 小时前
读《show your work》的一点感悟
后端
A尘埃3 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23073 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code3 小时前
(Django)初步使用
后端·python·django
代码之光_19803 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长3 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记4 小时前
DataX+Crontab实现多任务顺序定时同步
后端