Gin Web Framework part 5

Gin Web Framework part 5درود دوستان امروز میخوام در مورد بخش پنجم از سری مقالات فرم ورک Gin صحبت کنیمفهرست بخش پنجم از این مقالهControlling Log output coloringModel binding and validationCustom ValidatorsOnly Bind Query StringBind 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) }