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

相关推荐
2401_882727576 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
追逐时光者6 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
大梦百万秋7 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
斌斌_____7 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@8 小时前
Spring如何处理循环依赖
java·后端·spring
海绵波波1078 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
小奏技术9 小时前
RocketMQ结合源码告诉你消息量大为啥不需要手动压缩消息
后端·消息队列
AI人H哥会Java11 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱11 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django
奔跑草-11 小时前
【数据库】SQL应该如何针对数据倾斜问题进行优化
数据库·后端·sql·ubuntu