Gin框架基本使用(2)| 青训营

96 阅读2分钟

重定向

HTTP重定向

    r.GET("/1",func(c *gin.Context){
    
        c.Redirect(http.StatusMovedPermanently,"http://juejin.cn/")
    
    })
    

路由重定向

    r.GET("/1",func(c *gin.Context){
      c.Requset.URL.Path="/2"
      r.HandleContext(c)
    
    })
    
    r.GET("/2,func(c *gin.Context){
      c.JSON(http.StatusOK,gin.H{
          "message":"ok",
      })
    
    })

Gin路由

之前的r.GET,r.POST等等是普通的路由,匹配特定的请求类型。
此外还有一个可以匹配任意请求的方法

r.Any("/1",func(c *gin.Context){
    c.JSON(http.StatusOK,gin.H{"message":"ok"})
})

路由组

说白了就是把请求相同的前缀抽出来。

func main(){

    r=gin.Default()
    userGroup:=r.Group("/user")
    {
    userGroup.GET("/1",func(c *gin.Context){})
    userGroup.POST("/1",func(c *gin.Context){})
    userGroup.PUT("/1",func(c *gin.Context){})
    
    }

}

路由组也是支持嵌套的,可以自己试试。

gin中间件

Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

中间件在日常的开发中是会被经常使用的,比如登陆验证,或者接口耗时等等。

记录请求耗时的中间件,中间件必须是gin.HandlerFunc类型

func Cost() gin.HandlerFunc{
    return fun(c *gin.Context){
        start:=time.Now()
        //通过c.Set()可以在请求上下文中设置值,后续的函数可以读取到这个值
        c.Set("username","小明")
        //next函数调用后面的函数执行
        c.Next()
        cost:=time.Since(start)
        log.Println(cost)
    
    }

}

注册中间件 在gin框架中,我们可以为每个路由添加任意数量的中间件
首先gin会有默认的中间件,我们使用gin.Default()的时候,默认使用了Logger和Recovery中间件。
Logger用来将日志写入,gin.DefaultWriter,Recovery会recover任何panic,会写入500的响应码。
如果我们不想使用默认的两个中间件可以使用,gin.New()创建一个没有任何中间件的路由。

func main() {
	// 新建一个没有任何默认中间件的路由
	r := gin.New()
	// 注册一个全局中间件
	r.Use(Cost())
	
	r.GET("/test", func(c *gin.Context) {
		name := c.MustGet("name").(string) // 从上下文取值
		log.Println(name)
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello world!",
		})
	})
	r.Run()
}
// 给/test2路由单独注册中间件(可注册多个)
	r.GET("/test2", Cost(), func(c *gin.Context) {
		name := c.MustGet("name").(string) // 从上下文取值
		log.Println(name)
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello world!",
		})
	})