Gin Web Framework part 8

Gin Web Framework part 8درود دوستان امروز میخوام در مورد بخش هشتم از سری مقالات فرم ورک Gin صحبت کنیمفهرست بخش هشتم از این مقالهMultitemplateRedirectsCustom MiddlewareUsing BasicAuth() middlewareGoroutines inside a middlewareCustom HTTP configurationSupport Let's Encryptمیریم واسه توضیح هر بخشقسمت اول Multitemplateاین فرم ورک به طور پیش فرض از html.Template استفاده می کند و همچنین می توانید از multitemplate render هم استفاده کنید که یک رندر HTML سفارشی برای پشتیبانی از چند الگو است.قسمت دوم Redirectsبرای ریدایرکت کردن مورد استفاده قرار می گیره به صورت زیرr.GET(&quot/test&quot, func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, &quothttp://www.google.com/&quot) })برای استفاده از این خاصیت از متد c.rediectاستفاده می کنیمr.POST(&quot/test&quot, func(c *gin.Context) { c.Redirect(http.StatusFound, &quot/foo&quot) })قسمت سوم Custom Middlewareواسه دورس کردن یک میدلوریر سفارشی به صورت زیر عمل می کنیم. این کد رو در نظر بگیریدfunc MyLogger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // Set example variable c.Set(&quotexample&quot, &quot12345&quot) // before request c.Next() // after request latency := time.Since(t) log.Print(latency) // access the status we are sending status := c.Writer.Status() log.Println(status) } } func main() { r := gin.New() r.Use(MyLogger()) r.GET(&quot/test&quot, func(c *gin.Context) { example := c.MustGet(&quotexample&quot).(string) // it would print: &quot12345&quot log.Println(example) }) r.Run(&quot:8080&quot) }ما در اینجا یه متد تعریف کردیم به mylogger که کار خاصی انجام نمیده فقط یه عدد از نوع رشته رو برامون چاپ می کنه ما توی خط ۶ یه متغییر از نوع رشته تعریف کردیم با مقدار ۱۲۳۴۵ و اون مقدار رو توی تابع اصلی خط ۲۵ با متد mustget اون مقدار رو دریافت و چاپ می کندقسمت چهارم Using BasicAuth() middlewareنحوه استفاده از basicauth var secrets = gin.H{ &quotbardia&quot: gin.H{&quotemail&quot: &quotbardia@iran.new&quot, &quotphone&quot: &quot123456&quot}, &quoterfan&quot: gin.H{&quotemail&quot: &quoterfan@iran.new&quot, &quotphone&quot: &quot654321&quot}, &quotomid&quot: gin.H{&quotemail&quot: &quotomid@iran.new&quot, &quotphone&quot: &quot123654&quot}, } func main() { r := gin.Default() authorized := r.Group(&quot/admin&quot, gin.BasicAuth(gin.Accounts{ &quotbardia&quot: &quotbardia34&quot, &quoterfan&quot: &quoterfan1234&quot, &quotomid&quot: &quothello2&quot, })) authorized.GET(&quot/secrets&quot, func(c *gin.Context) { user := c.MustGet(gin.AuthUserKey).(string) if secret, ok := secrets[user]; ok { c.JSON(http.StatusOK, gin.H{&quotuser&quot: user, &quotsecret&quot: secret}) } else { c.JSON(http.StatusOK, gin.H{&quotuser&quot: user, &quotsecret&quot: &quotNO SECRET :(&quot}) } }) r.Run(&quot:8080&quot) }خوب ما اومدیم توی خط اول یه سری داده ایجاد کردیم نحوه ایجاد یه سری داده در فرم ورک جین به این صورت هست. خوب بعدش توی خط هشت اومدبم گفتیم هر اندپونتی که از طرف admin بیاد رو اعتبارسنجی کن ببین اون کاربرهای که توی خط اول تعریف کردیم هست یا نه که این چو کردن رو توی خط ۱۶ انجام میده در صورت بودن اون کاربر توی لیست مدنظر ما که توی خط اول هست اجازه ورود به بخش secrets رو داره توی خط نه تابع gin.basicaurh کارش همون ساخت یک mapهست همون کار map رو می کنهقسمت پنجم Goroutines inside a middlewareدو روش تعریف گورتینگ به صورت سنکرون و آسنکرون برای این کار هست. کافیه که ما از متد copy که توی خط چهار می باشد استفاده کنیم این روش میاد یک کپی فقط خواندنی ازش(همون url) ایجاد می کنه براخلاف اون چیزی هست که توی خط ۱۳ تعریف کردیم یعنی برای استفاده از c.request.url.path میاد به صورت ccp.request.url.path استفاده می کند. در اون قسمت c.request.url.path میاد از contextاستفاده می مند برای بدست آوردن آدرسfunc main() { r := gin.Default() r.GET(&quot/long_async&quot, func(c *gin.Context) { cCp := c.Copy() go func() { time.Sleep(5 * time.Second) log.Println(&quotDone! in path &quot + cCp.Request.URL.Path) }() }) r.GET(&quot/long_sync&quot, func(c *gin.Context) { time.Sleep(5 * time.Second) log.Println(&quotDone! in path &quot + c.Request.URL.Path) }) r.Run(&quot:8080&quot) }قسمت ششم Custom HTTP configurationنحوه استفاده از http.listenandserveدر حالت عادی به صورت زیر func main() { router := gin.Default() http.ListenAndServe(&quot:8080&quot, router) }اما برای شخصی سازی بیشتر به صورت زیر عمل کنیدfunc main() { router := gin.Default() s := &http.Server{ Addr: &quot:8080&quot, Handler: router, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } s.ListenAndServe() }قسمت هفتم Support Let's Encryptنحوه ارتباط با پروتکل https با استفاده از کتابخانه autolts در خط چهار و نحوه استغاده ازش توی خط ۱۳ ذکر شدهpackage main import ( &quotlog&quot &quotgithub.com/gin-gonic/autotls&quot &quotgithub.com/gin-gonic/gin&quot ) func main() { r := gin.Default() r.GET(&quot/ping&quot, func(c *gin.Context) { c.String(200, &quotpong&quot) }) log.Fatal(autotls.Run(r, &quotexample1.com&quot, &quotexample2.com&quot)) }نحوه شخصی سازی هم به صورت زیر در خط ۱۵package main import ( &quotlog&quot &quotgithub.com/gin-gonic/autotls&quot &quotgithub.com/gin-gonic/gin&quot &quotgolang.org/x/crypto/acme/autocert&quot ) func main() { r := gin.Default() r.GET(&quot/ping&quot, func(c *gin.Context) { c.String(200, &quotpong&quot) }) m := autocert.Manager{ Prompt: autocert.AcceptTOS, HostPolicy: autocert.HostWhitelist(&quotexample1.com&quot, &quotexample2.com&quot), Cache: autocert.DirCache(&quot/var/www/.cache&quot), } log.Fatal(autotls.RunWithManager(r, &m)) }