درود دوستان امروز میخوام در مورد بخش چهارم از سری مقالات فرم ورک Gin صحبت کنیم
فهرست بخش چهارم از این مقاله
میریم واسه توضیح هر بخش
// Simple group: user v1 := router.Group("/v1"){ v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.PUT("/change", changeEndpoint) } // Simple group: food v2 := router.Group("/v2"){ v2.GET("/list", llistEndpoint) v2.GET("/search", searchEndpoint) v2.POST("/save", saveEndpoint) }
یه زمانی پیش میاد توی برنامه نوشته شده تون تعداد روت های زیاد داشته باشید و بخواید مدیریت بهتری روی روت هاتون داشته باشید توی این فرم ورک می تونید از router.group همین طور که مشاهده می کنید در کد بالا استفاده کنید به خط ۲و۸ دقت کنید که apiهای food و user رو ازم هم جدا کردیم.
اگر بخواید از مدلویرهای Logger and Recovery استفاده نکنید از کد زیر در ابتدا برنامه تون استفاده کنید
r := gin.New()
اما اگر بخواید از مدلویرهای Logger and Recovery استفاده کنید از کد زیر در ابتدا برنامه تون استفاده کنید
r := gin.Default()
در صورتی که بخواهید از Logger یا Recovery استفاده کنید به صورت زیر r.use استفاده کنید
r.Use(gin.Logger())
r.Use(gin.Recovery())
اگر بخواهیم به مجموعه از روت هامون میدلویر اختصاص بدیم به صورت زیر
authorized := r.Group("/", AuthRequired())
خوب توی روش های بالا ما میدلیور خود فرم ورک رو استفاده می کردیم اما اگر بخواهیم یک نوع میدلویر از نوع recovery رو کاستوم کنیم به صورت زیر استفاده می کنیم
r.Use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) { i f err, ok := recovered.(string); ok { c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err)) } c.AbortWithStatus(http.StatusInternalServerError) } ))
گاهی اواقات نیازه ما لاگ ها رو اصلن بجای اینکه توی دیتابیس خاصی داشته باشیم توی فایل داشته باشیم
func main() { f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f) router := gin.Default() router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) router.Run(":8080") }
خوب اگه با گولنگ و این فرم ورک(البته تا اینجای کار)آشنا باشید قشنگ میفهمید که کد بالا یه فایل رو ایجاد می کنه و با استفاده از خط سوم میاد تمام فعل و انفعالات رو توی فایل مدنظر ذخیره می کنه به همین راحتی
اگه بخوایم یک لاگ شخصی دورس کنیم یعنی بگیم مثلن من میخوام لاگ هام چنین چیزهای (که در کد زیر هست) داشته باشم. به صورت زیر و با استفاده از متدی که در خط اول هست gin.LoggerWithFormatter(func(param gin.LogFormatterParams) یک استرینگ دورس کنیم از لاگ ها که نیاز داریم این لاگ ها توی خط ۴ تا ۱۲ تعریف شده
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, ) } ))