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

Gin Web Framework part 5

Gin Web Framework part 5
Gin Web Framework part 5

درود دوستان امروز میخوام در مورد بخش پنجم از سری مقالات فرم ورک Gin صحبت کنیم

فهرست بخش پنجم از این مقاله

  • Controlling Log output coloring
  • Model binding and validation
  • Custom Validators
  • Only Bind Query String
  • Bind Uri

میریم واسه توضیح هر بخش

قسمت اول Controlling Log output coloring

اگه میخواید لاگ های که توی کنسول می افته رنگی باشه از کد زیر ابتدای فایل اصلی

gin.ForceConsoleColor()

و اگر می خواید غیر فعال شه کد زیر

gin.DisableConsoleColor()

قسمت دوم Model binding and validation

این فرم ورک از استانداردهای همچون JSON, XML, YAML پشتیبانی می کند و از کتابخانه validator برای اعتبار سنجی استفاده می کند.

همچنین این فرم ورک دو روش برای bind کردن داره

  • روش Type - Must bind

استفاده از متد های Bind​ , ​ BindJSON​ , ​ BindXML​ , ​ BindQuery​ , ​ BindYAML​ , ​ BindHeader

نحوه رفتار به این صورت هست اگر در درخواست ما خطای وجود داشته باشد با استفاده از c.AbortWithError(400,err).SetType(ErrorTypeBind)​ اون خطار رو توی هدر Content-Type​ ​ text/plain; charset=utf-8 ارسال می کند.

  • روش Type - Should bind

استفاده از متدهای ShouldBind​,ShouldBindJSON​,ShouldBindXML​,ShouldBindQuery​,ShouldBindYAML​,ShouldBindHeader

اگر خطای در درخواست وجود داشته باشد، خطا برمی گردد و این توسعه دهنده است که مسئولیت رسیدگی مناسب به درخواست و خطا رو دارد. .و هنگام استفاده از این روش ، جین سعی می کند بسته به عنوان نوع محتوا ، هدر را ست کند.

به تک کد زیر توجه کنید

type Login struct { User string `form:&quotuser&quot json:&quotuser&quot xml:&quotuser&quot binding:&quotrequired&quot` Password string `form:&quotpassword&quot json:&quotpassword&quot xml:&quotpassword&quot binding:&quotrequired&quot` }

در کد بالا ما یه struct تعریف کردیم با دو فیلد از نوع string که هر دو ویژگی ساختار XML و JSON رو دارند که توی کد فوق مشخص کردیم و نوع اعتبارسنجی برای هردو فیلد رو اجباری کردیم.

اگه میخواید خروجی JSON بگیرید کد زیر

router.POST(&quot/loginJSON&quot, func(c *gin.Context) { var json Login if err := c.ShouldBindJSON(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{&quoterror&quot: err.Error() }) return } if json.User != &quotmanu&quot || json.Password != &quot123&quot { c.JSON(http.StatusUnauthorized, gin.H{&quotstatus&quot: &quotunauthorized&quot}) return } c.JSON(http.StatusOK, gin.H{&quotstatus&quot: &quotyou are logged in&quot}) })

با استفاده از متد ShouldBindJSON میاد ساختار JSON رو چک می کند اگر ساختار JSON اشباه بود توی خط چهارم خطای از نوع کد StatusBadRequest بر میگردونه و اما اگر دورست بود توی خط ۱۲ پیغام مناسب به همراه کد StatusOK رو برمی گردونه و اگر اشتباه بود توی خط نه این مورد رو مشخص کردیم.

اما اگر برای ساختار XMLبود بجای این تابع ShouldBindJSON تابعShouldBindXML رو جایگزین کنید

قسمت سوم Custom Validators

نحوه اعتبار سنجی سفارشی

package main import ( &quotnet/http&quot &quottime&quot &quotgithub.com/gin-gonic/gin&quot &quotgithub.com/gin-gonic/gin/binding&quot &quotgithub.com/go-playground/validator/v10&quot ) type Booking struct { CheckIn time.Time `form:&quotcheck_in&quot binding:&quotrequired,bookabledate&quot time_format:&quot2006-01-02&quot` CheckOut time.Time `form:&quotcheck_out&quot binding:&quotrequired,gtfield=CheckIn&quot time_format:&quot2006-01-02&quot` } var bookableDate validator.Func = func(fl validator.FieldLevel) bool { date, ok := fl.Field().Interface().(time.Time) if ok { today := time.Now() if today.After(date) { return false } } return true } func main() { route := gin.Default() if v, ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation(&quotbookabledate&quot, bookableDate) } route.GET(&quot/bookable&quot, getBookable) route.Run(&quot:8085&quot) }

خوب توی خط ۹ ما یه ساختار تعریف کردیم و توی خط ۱۵ تا ۲۴ اومدبم اعتبارسنجی خودمون رو دورس کردیم برای این کار ما نیاز به کتابخونه اصلی داریم که توی خط ۷ تعریف کردیم و توی تابع اعتبار سنجی خودمون تعریف کردیم این تایع اعتباری سنجی ما توی خط ۲۸ می باشد به نام bookableDate

قسمت چهارم Only Bind Query String

یه زمانی هست که می خوای اطلاعات رو به صورت رشته توی کنسول نشون بدی و به صورت جزيی یعنی فرض کن یه ساختار داری با ۱۵ تا فیلد ولی فقط دو تاش رو میخوای که توی خط ۴و ۵ نشون دادیم

var person Person if c.ShouldBindQuery(&person) == nil { log.Println(&quot====== Only Bind By Query String ======&quot) log.Println(person.Name) log.Println(person.Address) }
گوگولنگgingogolang
Go Developer(gopher-academy.ir)
شاید از این پست‌ها خوشتان بیاید