go學習03

非活体攻击發表於2024-05-01

路由分組

	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