路由分組
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.Stdout
router.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