路由分组
v1 := router.Group("/v1"){v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)}v2 := router.Group("/v2"){v2.POST("/login", loginEndpoint)v2.POST("/submit", submitEndpoint)v2.POST("/read", readEndpoint)}
自定义中间件
原理类似洋葱中间件
func middle1() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("middle1前")//与Next()相反的是Abort(),表示终止流程c.Next()fmt.Println("middle1后")}
}func middle2() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("middle2前")c.Next()fmt.Println("middle2后")}
}func main() {ginServer := gin.Default()//v1 := ginServer.Group("/v1").Use(middle1()).Use(middle2())v1 := ginServer.Group("/v1").Use(middle1(), middle2()){v1.POST("/login", func(c *gin.Context) {fmt.Println("中")c.JSON(200, gin.H{"message": "login success",})})}ginServer.Run(":8080")
}
实际项目中间件的使用场景有:身份验证和权限控制、日志记录、错误处理和恢复、请求处理时间统计、请求数据处理、路由控制、缓存处理和跨域资源共享
日志
写日志文件
func main() {// 禁用控制台颜色gin.DisableConsoleColor()// 创建记录日志的文件f, _ := os.Create("gin.log")gin.DefaultWriter = io.MultiWriter(f)// 如果需要将日志同时写入文件和控制台,请使用以下代码// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)router := gin.Default()router.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})router.Run(":8080")
}
自定义日志格式
func main() {router := gin.New()// LoggerWithFormatter 中间件会将日志写入 gin.DefaultWriter// By default gin.DefaultWriter = os.Stdoutrouter.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {// 你的自定义格式return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",param.ClientIP,param.TimeStamp.Format(time.RFC1123),param.Method,param.Path,param.Request.Proto,param.StatusCode,param.Latency,param.Request.UserAgent(),param.ErrorMessage,)}))router.Use(gin.Recovery())router.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})router.Run(":8080")
}
不推荐go自带的日志工具,推荐使用logrus或者是go-logging