GIN框架入门 | 青训营

106 阅读2分钟

GIN框架入门

Gin 是一个用Go编写的 Web 框架。

安装

在终端中输入下面的命令可以装

go get -u github.com/gin-gonic/gin

如果出现下载超时问题可以通过配用户环境变量

GOPROXY=https://goproxy.io || https://goproxy.cn

安装后只需要在文件中添加导入

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

快速入门

package main
​
import "github.com/gin-gonic/gin"func main() {
    // 创建一个服务
    r := gin.Default()
    //
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
//此时执行代码之后,在浏览器中可以输入http://localhost:8080/ping
//浏览器会返回信息

http方法和路由参数

package main
​
func main{
    router := gin.Default()
    
    //http请求
    router.GET("/Get", getting)
    router.POST("/Post", posting)
    router.PUT("/Put", putting)
    router.DELETE("/Delete", deleting)
    router.PATCH("/Patch", patching)
    router.HEAD("/Head", head)
    router.OPTIONS("/Options", options)
    
    
    // 此 handler 将匹配 /user/123 但不会匹配 /user/ 或者 /user
    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "%s", name) //http.StatusOK 状态码
    })
​
    // 此 handler 将匹配 /user/123/ 和 /user/123/send
    // 如果没有其他路由匹配 /user/john,它将重定向到 /user/john/
    router.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })
    
    
    router.Run(":8081") // 不写的话默认是8080,也可以更改
}

路由组和重定向

    
    v1 := router.Group("/user")
    {
        v1.POST("/login", login)
        v1.POST("/submit", submit)
        v1.GET("/read", read)
    }
​
    v2 := router.Group("/user1")
    {
        v2.POST("/login", login)
        v2.POST("/submit", submit)
        v2.POST("/read", read)
    }
    //http重定向
    r.GET("/read", func(c *gin.Context) {
        c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")
    })
    r.POST("/test", func(c *gin.Context) {
        c.Redirect(http.StatusFound, "/login")
    })
    //路由重定向,使用 HandleContext
    r.GET("/test", func(c *gin.Context) {
    c.Request.URL.Path = "/test2"
    r.HandleContext(c)
    })
    r.GET("/test2", func(c *gin.Context) {
        c.JSON(200, gin.H{"hello": "world"})
    })
​
​
​

HTTP重定向,也称为网页跳转,是在HTTP协议下工作的,它根据HTTP请求和响应的状态来决定是否跳转,以及跳转到哪个页面。常见的HTTP状态码有301、302、303、307、308等。HTTP重定向的优点是它能够实现网页内容的更新,但缺点是跳转过程中可能会暴露用户的当前浏览路径。

路由重定向是Django框架提供的一种重定向方式,它是基于URL路由配置来实现的。路由重定向将用户从当前URL自动重定向到另一个URL,而不需要用户手动操作浏览器地址栏。

总结就是http重定向就是页面跳转来实现网页内容的更新,路由重定向的优点是能够实现无缝的用户体验

中间件

func Logger() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
​
        // 设置 example 变量
        c.Set("example", "12345")
​
        // 请求前
​
        c.Next()
​
        // 请求后
        latency := time.Since(t)
        log.Print(latency)
​
        // 获取发送的 status
        status := c.Writer.Status()
        log.Println(status)
    }
}
​
func main() {
    r := gin.New()
    r.Use(Logger())
​
    r.GET("/test", func(c *gin.Context) {
        example := c.MustGet("example").(string)
​
        // 打印:"12345"
        log.Println(example)
    })
​
    // 监听并在 0.0.0.0:8080 上启动服务
    r.Run(":8080")
}

main() 函数中,创建了一个新的 Gin 实例(r := gin.New()),并使用 Logger() 函数作为中间件。这意味着每次有请求到达时,都会执行 Logger() 函数中的内容

HTML 渲染

使用 LoadHTMLGlob() 或者 LoadHTMLFiles()

func main() {
    router := gin.Default()
    //LoadHTMLGlob() 函数使用路径匹配的方式来加载 HTML 文件
    router.LoadHTMLGlob("templates/**/*")
    router.GET("/posts/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
            "title": "Posts",
        })
    })
    //LoadHTMLFiles() 函数则是用来加载单个 HTML 文件的
    router.GET("/users/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
            "title": "Users",
        })
    })
    router.Run(":8080")
}