gin框架05

gin渲染

1、各种数据格式的响应

json、结构体、XML、YAML类似于java的properties、ProtoBuf

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/gin-gonic/gin/testdata/protoexample"
)
// 多响应方式

func main() {
    // 1. 创建路由器
    r := gin.Default()

        // 1.json
        r.GET("/someJSON",func(c *gin.Context){
            c.JSON(200,gin.H{"message":"someJSON","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{"name":"abc"})
    })
    // 4.YAML响应
    r.GET("/someYAML",func(c *gin.Context){
        c.YAML(200,gin.H{"name":"zhangsan"})
    })
    // 5.protobuf格式,谷歌开发的高效存储读取的工具
    // 数组?切片? 如果自己构建一个擦混输格式,应该是什么格式?
    r.GET("/someProtoBuf",func(c *gin.Context){
        reps:=[]int64{int64(1),int64(2)}
        // 定义数据
        label := "label"
        // 传protobuf格式格式数据
        data := &protoexample.Test{
            Label:&label,
            Reps: reps,
        }
        c.ProtoBuf(200,data)
    })
    // 3.监听端口,默认8080
    r.Run(":8000")
}
JSON结果
HTML模板渲染

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

package main

import (
    "github.com/gin-gonic/gin"
)
// HTML渲染

func main() {
    // 1. 创建路由器
    r := gin.Default()
    // 加载模板文件
    r.LoadHTMLGlob("templates/*")
    // r.LoadHTML
    r.GET("/index", func(c *gin.Context) {
        // 根据文件名渲染
        // 最终json将title替换
        c.HTML(200,"index.tmpl",gin.H{"title":"我的标题"})
    })
    // 3.监听端口,默认8080
    r.Run(":8000")
}
模板

重定向

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)
// HTML渲染

func main() {
    // 1. 创建路由器
    r := gin.Default()
    r.GET("/redirect", func(c *gin.Context) {
        // 支持内部和外部重定向
        c.Redirect(http.StatusMovedPermanently,"http://baidu.com")
    })
    // 3.监听端口,默认8080
    r.Run(":8000")
}

同步异步

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

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "time"
)
// HTML渲染

func main() {
    // 1. 创建路由器
    r := gin.Default()
    // 1.同步
    r.GET("/long_async", func(c *gin.Context) {
        // 需要搞一个副本
        copyContext := c.Copy()
        // 异步处理
        go func() {
            time.Sleep(3* time.Second)
            fmt.Println("异步执行:"+copyContext.Request.URL.Path)
        }()
    })
    // 2.异步
    r.GET("/long_sync", func(c *gin.Context) {
        time.Sleep(3* time.Second)
        fmt.Println("同步执行:"+c.Request.URL.Path)
    })
    // 3.监听端口,默认8080
    r.Run(":8000")
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容