四、gin渲染
1. 各种数据格式的响应
-
Json,Struct,XML,YAML,ProtoBuf
后台代码// 1. json r.GET("/someJson", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "json", "status": http.StatusOK}) }) // 2. 结构体 r.GET("/someStruct", func(c *gin.Context) { var msg struct { Name string Message string Number int } msg.Name = "root" msg.Message = "message" msg.Number = 1 c.JSON(http.StatusOK, msg) }) // 3.XML r.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK,gin.H{ "message":"msg", }) }) // 4.YAML响应 r.GET("/someYaml", func(c *gin.Context) { c.YAML(http.StatusOK,gin.H{ "name":"henry", }) }) // 5.protobuf格式,谷歌开发的高效存储读取的工具 r.GET("/someProtobufBuf", func(c *gin.Context) { resp :=[]int64{int64(1),int64(2)} // 定义数据 label := "label" // 传protoBuf格式数据 data := &protoexample.Test{ Label: &label, Reps: resp, } c.ProtoBuf(http.StatusOK,data) })
2. HTML模板渲染
-
gin支持加载HTML模块,然后根据模板参数进行配置并返回相应的数据,本质是字符串替换
-
LoadHTMLGlob()方法可以加载模块文件,r.LoadHTMLFiles() 加载单个文件
后台代码
//创建默认路由 r := gin.Default() // 加载模板文件,文件夹下所有 r.LoadHTMLGlob("test/*") //r.LoadHTMLFiles() 加载文件 r.GET("/index", func(c *gin.Context) { // 根据文件名渲染 c.HTML(http.StatusOK,"index.tmpl",gin.H{ "title":"myTitle", }) })
前台代码
<html> <h1> {{.title}} </h1> </html>
3. 重定向
关键函数: c.Redirect()
后台代码
r.GET("/redirect", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently,"http://www.baidu.com")
})
4. 同步异步
-
goroutine机制可以方便地实现异步处理
-
另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
关键函数: 异步需要copy一个context去使用后台代码
// 1.异步 r.GET("/login_async", func(c *gin.Context) { // 需要搞一个副本 copyContext := c.Copy() // 异步处理 go func() { time.Sleep(3 * time.Second) log.Println("异步执行: ", copyContext.Request.URL.Path) }() }) // 2.同步 r.GET("/login_sync", func(c *gin.Context) { time.Sleep(3 * time.Second) log.Println("同步执行: ", c.Request.URL.Path) })