普拉多VX

人生一路,不问来时,不知归期

0%

Gin web开发系列(二)

Gin渲染

Gin支持各种渲染方法

1
2
3
4
5

c.String() //返回字符串
c.XML() //返回XML格式
c.JSON() //返回JSON数据格式
c.HTML() //返回HTML文档格式

模版

通常情况下使用Gin一般是用于写API接口,那另一个就是使用模版渲染。API通常用JSON数据返回即可,如果要用模版渲染就要使用HTML方式。
gin的模版文件比较简单,在工作目录下创建一个index.html即可,也可以使用go的模版文件命名index.tmpl。

参考项目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)

func main() {

r:=gin.Default()
r.LoadHTMLFiles("index.html")
r.GET("/index", func(context *gin.Context) {
context.HTML(200,"index.html",nil)
})
http.ListenAndServe(":8003",r)
}

代码首先创建了index.html的模版
通过r.LoadHTMLFiles加载这个文件,只有加载后才能使用模版
渲染模版context.HTML(200,”index.html”,nil) nil表示不需要向模版传递变量,设置就可以向模版数据

模版变量

上面我们提到了可以向模版传递变量,现在传递一个测试下

index.html

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
hello world my {{.}}

</body>
</html>

传递变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)

func main() {

r:=gin.Default()
r.LoadHTMLFiles("index.html") //r.LoadHTMLFiles("index.html","user.html")加载多个模版
r.GET("/index", func(context *gin.Context) {
context.HTML(200,"index.html","name is roddy")
})
r.Run(":8003")
}

传递多个变量

使用gin.H, H is a shortcut for map[string]interface{}

1
2
3
4
5
6
7

r.GET("/index", func(context *gin.Context) {
context.HTML(200,"index.html",gin.H{
"name":"roddy",
"age":29,
})
})

模版使用 使用.”变量名”,如果使用{{.}}返回渲染的数据,interface对象

1
2
3
4
<body>
hello world my name {{.name}} age {{ .age}}

</body>

访问请求

加载目录

r.LoadHTMLFiles 可以加载多个模版文件,但是如果想加载一个目录下的所有模版文件如何设置呢?Gin提供了LoadHTMLGlob方法即可。
创建一个templates并将html文件移动到该目录下

修改代码如下

1
2
r:=gin.Default()
r.LoadHTMLGlob("template/*")

参考实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
import (
"github.com/gin-gonic/gin"

)

func main() {

r:=gin.Default()
r.LoadHTMLGlob("templates/*")


r.GET("/index", func(context *gin.Context) {
context.HTML(200,"index.html",gin.H{
"name":"roddy",
"age":29,
})
})


r.GET("/user", func(context *gin.Context) {
context.HTML(200,"user.html",nil)
})

r.Run(":8003")
}

加载子目录

如果你的模版是类似这样的

1
2
3
templates/user/index.html
templates/admin/index.html
templates/product/index.html

使用**/*加载多级模版

1
r.LoadHTMLGlob("templates/**/*")

自定义函数

在html模版中默认的模版功能有时候可能不能满足我们的需求,这个时候我们需要自定一个函数解决,下面演示两个功能。一个是将string格式化成html格式,一个是md5

使用r.SetFuncMap()方法

实例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
r := gin.Default()
//自定义模版变量必须放在解析模版之前
r.SetFuncMap(template.FuncMap{
"safe": func(str string) template.HTML{
return template.HTML(str)
},
})

r.LoadHTMLGlob("templates/*")

//r.LoadHTMLFiles("user.html")
r.GET("/user", func(context *gin.Context) {
context.HTML(200,"user.html","<a href='xxxx'>herf</a>") //将字符串标签格式成html格式
})
1
<h1>This Is User Page {{ . |safe }} </h1> //使用

实例二:

1
2
3
4
5
6
7
8
9
10

r.SetFuncMap(template.FuncMap{
"safe": func(str string) template.HTML{ //这里可以添加多个自定义变量
return template.HTML(str)
},
"md5": func(str string) (string,error){
hash:= md5.Sum([]byte(str))
return hex.EncodeToString(hash[:]),nil
},
})

使用

1
{{ md5 .name}}

返回JSON数据

很多时候我们需要返回JSON数据给前端,那么可使用JSON渲染。

1.方法一

1
2
3
4
5
6
7
8
9
10
// json数据
r.GET("/json",func(c *gin.Context){
data := map[string]interface{}{
"name":"roddy",
"message":"hello world!",
"age":28,
}

c.JSON(http.StatusOK,data)
})

2.方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
// 以结构体返回json数据
r.GET("/structJson",func(c *gin.Context){
type Msg struct{
Name string `json:"name"`
Age int
Message string

}
//实例化结构体数据
data := Msg{"roddy",23,"this is "}

c.JSON(http.StatusOK,data)
})