• 4gin渲染


    一 各种数据格式的响应

    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")
    }
    
  • 相关阅读:
    C#基础
    C#基础
    Sqlserver数据库备份和还原
    C#基础
    Python3学习笔记4
    Python3学习笔记3
    调用接口Post xml和json数据的通用方法
    Python3学习笔记2
    Python3学习笔记1
    常见的PHP函数代码性能对比
  • 原文地址:https://www.cnblogs.com/Henry121/p/15627425.html
Copyright © 2020-2023  润新知