میریم واسه توضیح هر بخش
این فرم ورک به طور پیش فرض از html.Template استفاده می کند و همچنین می توانید از multitemplate render هم استفاده کنید که یک رندر HTML سفارشی برای پشتیبانی از چند الگو است.
برای ریدایرکت کردن مورد استفاده قرار می گیره به صورت زیر
r.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") })
برای استفاده از این خاصیت از متد c.rediectاستفاده می کنیم
r.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") })
واسه دورس کردن یک میدلوریر سفارشی به صورت زیر عمل می کنیم. این کد رو در نظر بگیرید
func MyLogger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // Set example variable c.Set("example", "12345") // 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("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" log.Println(example) }) r.Run(":8080") }
ما در اینجا یه متد تعریف کردیم به mylogger که کار خاصی انجام نمیده فقط یه عدد از نوع رشته رو برامون چاپ می کنه ما توی خط ۶ یه متغییر از نوع رشته تعریف کردیم با مقدار ۱۲۳۴۵ و اون مقدار رو توی تابع اصلی خط ۲۵ با متد mustget اون مقدار رو دریافت و چاپ می کند
نحوه استفاده از basicauth
var secrets = gin.H{ "bardia": gin.H{"email": "bardia@iran.new", "phone": "123456"}, "erfan": gin.H{"email": "erfan@iran.new", "phone": "654321"}, "omid": gin.H{"email": "omid@iran.new", "phone": "123654"}, } func main() { r := gin.Default() authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ "bardia": "bardia34", "erfan": "erfan1234", "omid": "hello2", })) authorized.GET("/secrets", func(c *gin.Context) { user := c.MustGet(gin.AuthUserKey).(string) if secret, ok := secrets[user]; ok { c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) } else { c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) } }) r.Run(":8080") }
خوب ما اومدیم توی خط اول یه سری داده ایجاد کردیم نحوه ایجاد یه سری داده در فرم ورک جین به این صورت هست. خوب بعدش توی خط هشت اومدبم گفتیم هر اندپونتی که از طرف admin بیاد رو اعتبارسنجی کن ببین اون کاربرهای که توی خط اول تعریف کردیم هست یا نه که این چو کردن رو توی خط ۱۶ انجام میده در صورت بودن اون کاربر توی لیست مدنظر ما که توی خط اول هست اجازه ورود به بخش secrets رو داره توی خط نه تابع gin.basicaurh کارش همون ساخت یک mapهست همون کار map رو می کنه
دو روش تعریف گورتینگ به صورت سنکرون و آسنکرون برای این کار هست. کافیه که ما از متد copy که توی خط چهار می باشد استفاده کنیم این روش میاد یک کپی فقط خواندنی ازش(همون url) ایجاد می کنه براخلاف اون چیزی هست که توی خط ۱۳ تعریف کردیم یعنی برای استفاده از c.request.url.path میاد به صورت ccp.request.url.path استفاده می کند. در اون قسمت c.request.url.path میاد از contextاستفاده می مند برای بدست آوردن آدرس
func main() { r := gin.Default() r.GET("/long_async", func(c *gin.Context) { cCp := c.Copy() go func() { time.Sleep(5 * time.Second) log.Println("Done! in path " + cCp.Request.URL.Path) }() }) r.GET("/long_sync", func(c *gin.Context) { time.Sleep(5 * time.Second) log.Println("Done! in path " + c.Request.URL.Path) }) r.Run(":8080") }
نحوه استفاده از http.listenandserveدر حالت عادی به صورت زیر
func main() { router := gin.Default() http.ListenAndServe(":8080", router) }
اما برای شخصی سازی بیشتر به صورت زیر عمل کنید
func main() { router := gin.Default() s := &http.Server{ Addr: ":8080", Handler: router, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } s.ListenAndServe() }
نحوه ارتباط با پروتکل https با استفاده از کتابخانه autolts در خط چهار و نحوه استغاده ازش توی خط ۱۳ ذکر شده
package main import ( "log" "github.com/gin-gonic/autotls" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) log.Fatal(autotls.Run(r, "example1.com", "example2.com")) }
نحوه شخصی سازی هم به صورت زیر در خط ۱۵
package main import ( "log" "github.com/gin-gonic/autotls" "github.com/gin-gonic/gin" "golang.org/x/crypto/acme/autocert" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) m := autocert.Manager{ Prompt: autocert.AcceptTOS, HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), Cache: autocert.DirCache("/var/www/.cache"), } log.Fatal(autotls.RunWithManager(r, &m)) }