# Day 16 : Golang Gin(2) - Validatar ## 前言 在Gin裡面其實有內建validator,可以透過binding在定義結構體的時候進行資料驗證,詳系的驗證規則可以參考[官方文件](https://pkg.go.dev/github.com/go-playground/validator/v10),這邊整理比較常見的規則如下, | Tag | Meaning | |:--------:|:------------------:| | required | 必填 | | unique | 唯一 | | max | 最大值 | | min | 最小值 | | gte | 大於等於 | | gt | 大於 | | lte | 小於等於 | | lt | 小於 | | oneof | 必為指定的其中一個 | 例如此時我們修改User.go如下,因為密碼最小要5個元素,如果只輸入abcd就會發生錯誤(如圖一)。 ```go= package models type User struct { Id int `json:"UserId" binding:"required"` Name string `json:"UserName" binding:"required,gte=3"` Password string `json:"UserPassword" binding:"required,min=5,max=20"` Email string `json:"UserEmail" binding:"email"` } ```  (圖一,參考來源:Postman) ## 自行建立規則 當然除了使用package內建的規則以外,我們也可以自訂驗證的規則。 首先go get 指令 `go get github.com/go-playground/validator/v10`。 接下來新增middlewares/validator.go,在裡面新增驗證密碼的函式UserPwd(),方法如下 - `field.Field().String()`取得要驗證的值並轉換為字串。 - `^[A-Z]\w{5,20}$`正則表達是代表第一個一定要是大寫英文字母,且後面要5~20個字元 - `regexp.MatchString()`做match回傳bool和err,在此忽略err。 ```go= package middlewares import ( "regexp" "github.com/go-playground/validator/v10" ) func UserPwd(field validator.FieldLevel) bool{ if match, _ := regexp.MatchString(`^[A-Z]\w{5,20}$`,field.Field().String());match{ return true } return false } ``` 同時要於修改main.go和User.go如下 在main.go的第15行,先透過binding.Validator.Engine()取得Gin框架裡面的驗證引擎,將該驗證引擎存在變數v。 然後透過RegisterValidation註冊一個自定義的驗證方法middlewares.UserPwd,並將其綁定到 pwdvalidation這個tag上,就可以在該tag使用我們定義的規則了。 ```go= //main.go package main import ( "golangGinPractice/middlewares" "golangGinPractice/route" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10" ) func main(){ router := gin.Default() if v, ok := binding.Validator.Engine().(*validator.Validate);ok{ v.RegisterValidation("pwdvalidation",middlewares.UserPwd) } api := router.Group("/api") route.AddUserRouter(api) router.Run(":8080") } ``` 修改我們在User.go裡面,Password所binding的規則,tag改為上面定義的pwdvalidation。 ```go= //User.go package models type User struct { Id int `json:"UserId" binding:"required"` Name string `json:"UserName" binding:"required,gte=3"` // 修改Passwrod的規則 Password string `json:"UserPassword" binding:"required,pwdvalidation"` Email string `json:"UserEmail" binding:"email"` } ``` 如果密碼第一個字母不是大寫會失敗  (圖二,參考來源:Postman) 密碼的第一個字母改成大寫就可以成功  (圖三,參考來源:Postman) ## References 1. https://www.youtube.com/playlist?list=PLKDLBB0AVnh66JwQA9nWLwoncG96vkE2N 2. https://www.readfog.com/a/1637366423504392192 3. https://github.com/go-playground/validator 4. https://yourbasic.org/golang/regexp-cheat-sheet/ ###### tags: `About Go`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up