mrbardia72
mrbardia72
خواندن ۳ دقیقه·۴ سال پیش

Gin Web Framework part 8

Gin Web Framework part 8
Gin Web Framework part 8
  • درود دوستان امروز میخوام در مورد بخش هشتم از سری مقالات فرم ورک Gin صحبت کنیم
  • فهرست بخش هشتم از این مقاله
  • Multitemplate
  • Redirects
  • Custom Middleware
  • Using BasicAuth() middleware
  • Goroutines inside a middleware
  • Custom HTTP configuration
  • Support 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)) }


گوگولنگgogolang
Go Developer(gopher-academy.ir)
شاید از این پست‌ها خوشتان بیاید