4-gin渲染

一 各种数据格式的响应

package main

import (
   "github.com/gin-gonic/gin"
   "github.com/gin-gonic/gin/testdata/protoexample"
)

// 多种响应方式
func main() {
   r := gin.Default()
   // 1.响应jsonjson
   r.GET("/someJSON", func(c *gin.Context) {
      c.JSON(200, gin.H{"message": "成功", "status": 200})
   })
   // 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 = 123
      c.JSON(200, msg)
   })
   // 3.响应XML
   r.GET("/someXML", func(c *gin.Context) {
      c.XML(200, gin.H{"message": "成功","sex":"男"})
   })
   // 4.YAML响应
   r.GET("/someYAML", func(c *gin.Context) {
      c.YAML(200, gin.H{"name": "lqz","sex":"男"})
   })
   // 5.protobuf格式,谷歌开发的高效存储读取的工具
   r.GET("/someProtoBuf", func(c *gin.Context) {
      reps := []int64{int64(10), int64(20)}
      // 定义数据
      label := "lqz_label"
      // protobuf 的具体定义写在 testdata/protoexample 文件中。
      data := &protoexample.Test{
         Label: &label,
         Reps:  reps,
      }
      // 请注意,数据在响应中变为二进制数据
      // 将输出被 protoexample.Test protobuf 序列化了的数据
      c.ProtoBuf(200, data)
   })

   r.Run(":8080")
}

二 HTML模板渲染

  • gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换
  • LoadHTMLGlob()方法可以加载模板文件

目录结构

image-20200916004820498

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.title}}</title>
</head>
<body>
我的名字是:{{.name}}
</body>
</html>

main.go

package main

import (
   "net/http"

   "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   r.LoadHTMLGlob("templates/*")
   r.GET("/index", func(c *gin.Context) {
      c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是测试", "name": "lqz"})
   })
   r.Run()
}

三 重定向

package main

import (
   "net/http"

   "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   r.GET("/index", func(c *gin.Context) {
      c.Redirect(http.StatusMovedPermanently, "http://www.liuqingzheng.top")
   })
   r.Run()
}

四 同步异步

  • goroutine机制可以方便地实现异步处理
  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
package main

import (
   "github.com/gin-gonic/gin"
   "log"
   "time"
)

func main() {
   r := gin.New()
   // 1.异步
   r.GET("/long_async", func(c *gin.Context) {
      // 需要搞一个副本
      copyContext := c.Copy()
      // 异步处理
      go func() {
         time.Sleep(3 * time.Second)
         log.Println("异步执行:" + copyContext.Request.URL.Path)
      }()
      c.JSON(200,gin.H{"msg":"异步请求成功"})
   })
   // 2.同步
   r.GET("/long_sync", func(c *gin.Context) {
      time.Sleep(3 * time.Second)
      log.Println("同步执行:" + c.Request.URL.Path)
      c.JSON(200,gin.H{"msg":"同步请求成功"})
   })

   r.Run(":8000")
}
posted @ 2021-12-01 09:07  Henry121  阅读(36)  评论(0编辑  收藏  举报