درود دوستان امروز میخوام در مورد بخش پنجم از سری مقالات فرم ورک Gin صحبت کنیم
فهرست بخش پنجم از این مقاله
میریم واسه توضیح هر بخش
اگه میخواید لاگ های که توی کنسول می افته رنگی باشه از کد زیر ابتدای فایل اصلی
gin.ForceConsoleColor()
و اگر می خواید غیر فعال شه کد زیر
gin.DisableConsoleColor()
این فرم ورک از استانداردهای همچون JSON, XML, YAML پشتیبانی می کند و از کتابخانه validator برای اعتبار سنجی استفاده می کند.
همچنین این فرم ورک دو روش برای bind کردن داره
استفاده از متد های Bind , BindJSON , BindXML , BindQuery , BindYAML , BindHeader
نحوه رفتار به این صورت هست اگر در درخواست ما خطای وجود داشته باشد با استفاده از c.AbortWithError(400,err).SetType(ErrorTypeBind) اون خطار رو توی هدر Content-Type text/plain; charset=utf-8 ارسال می کند.
استفاده از متدهای ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML,ShouldBindHeader
اگر خطای در درخواست وجود داشته باشد، خطا برمی گردد و این توسعه دهنده است که مسئولیت رسیدگی مناسب به درخواست و خطا رو دارد. .و هنگام استفاده از این روش ، جین سعی می کند بسته به عنوان نوع محتوا ، هدر را ست کند.
به تک کد زیر توجه کنید
type Login struct { User string `form:"user" json:"user" xml:"user" binding:"required"` Password string `form:"password" json:"password" xml:"password" binding:"required"` }
در کد بالا ما یه struct تعریف کردیم با دو فیلد از نوع string که هر دو ویژگی ساختار XML و JSON رو دارند که توی کد فوق مشخص کردیم و نوع اعتبارسنجی برای هردو فیلد رو اجباری کردیم.
اگه میخواید خروجی JSON بگیرید کد زیر
router.POST("/loginJSON", func(c *gin.Context) { var json Login if err := c.ShouldBindJSON(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error() }) return } if json.User != "manu" || json.Password != "123" { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) return } c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) })
با استفاده از متد ShouldBindJSON میاد ساختار JSON رو چک می کند اگر ساختار JSON اشباه بود توی خط چهارم خطای از نوع کد StatusBadRequest بر میگردونه و اما اگر دورست بود توی خط ۱۲ پیغام مناسب به همراه کد StatusOK رو برمی گردونه و اگر اشتباه بود توی خط نه این مورد رو مشخص کردیم.
اما اگر برای ساختار XMLبود بجای این تابع ShouldBindJSON تابعShouldBindXML رو جایگزین کنید
نحوه اعتبار سنجی سفارشی
package main import ( "net/http" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10" ) type Booking struct { CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"` CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` } 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("bookabledate", bookableDate) } route.GET("/bookable", getBookable) route.Run(":8085") }
خوب توی خط ۹ ما یه ساختار تعریف کردیم و توی خط ۱۵ تا ۲۴ اومدبم اعتبارسنجی خودمون رو دورس کردیم برای این کار ما نیاز به کتابخونه اصلی داریم که توی خط ۷ تعریف کردیم و توی تابع اعتبار سنجی خودمون تعریف کردیم این تایع اعتباری سنجی ما توی خط ۲۸ می باشد به نام bookableDate
یه زمانی هست که می خوای اطلاعات رو به صورت رشته توی کنسول نشون بدی و به صورت جزيی یعنی فرض کن یه ساختار داری با ۱۵ تا فیلد ولی فقط دو تاش رو میخوای که توی خط ۴و ۵ نشون دادیم
var person Person if c.ShouldBindQuery(&person) == nil { log.Println("====== Only Bind By Query String ======") log.Println(person.Name) log.Println(person.Address) }