公众号:程序员读书,欢迎关注
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
支持多种数据格式响应,我们可以根据自己的需求选择对应的数据格式。