重定向
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!",
})
})