r := gin.Default()
Default
函数会默认绑定两个已经准备好的中间件,它们就是Logger 和 Recovery,帮助我们打印日志输出和painc
处理。
func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine }
Use
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes
HandlerFunc
r.GET("/", func(c *gin.Context) { fmt.Println("首页") c.JSON(200, "") })
func(c *gin.Context)HandlerFunc
gin.BasicAuth
r := gin.Default() r.Use(gin.BasicAuth(gin.Accounts{ "admin": "123456", })) r.GET("/", func(c *gin.Context) { c.JSON(200, "首页") }) r.Run(":8080")
admin123456http://localhost:8080/首页
针对特定URL的Basic Authorization
其实在实际的项目开发中,我们基本上不太可能对所有的URL都进行认证的,一般只有一些需要认证访问的数据才需要认证,比如网站的后台,那么这时候我们就可以用分组路由来处理。
func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, "首页") }) adminGroup := r.Group("/admin") adminGroup.Use(gin.BasicAuth(gin.Accounts{ "admin": "123456", })) adminGroup.GET("/index", func(c *gin.Context) { c.JSON(200, "后台首页") }) r.Run(":8080") }
//admin/index/admin/*/admin
通过分组路由的控制,我们可以比较灵活的设置HTTP认证,粒度可以自己随意控制。
自定义中间件
HandlerFuncHandlerFunc
func costTime() gin.HandlerFunc { return func(c *gin.Context) { //请求前获取当前时间 nowTime := time.Now() //请求处理 c.Next() //处理后获取消耗时间 costTime := time.Since(nowTime) url := c.Request.URL.String() fmt.Printf("the request URL %s cost %v ", url, costTime) } }
c.Nextc.Next
有了自定义的中间件,我们就可以这么使用。
func main() { r := gin.New() r.Use(costTime()) r.GET("/", func(c *gin.Context) { c.JSON(200, "首页") }) r.Run(":8080") }
现在启动程序,在浏览器里打开就可以看到如下日志信息了。
the request URL / cost 26.533µs
通过自定义中间件,我们可以很方便的拦截请求,来做一些我们需要做的事情,比如日志记录、授权校验、各种过滤等等。