您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Golang驗(yàn)證器之validator怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Golang驗(yàn)證器之validator怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
Validator
是一個(gè) Golang 的第三方庫(kù),用于對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),常用于 API 的開(kāi)發(fā)中,對(duì)客戶(hù)端發(fā)出的請(qǐng)求數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn),防止惡意請(qǐng)求。
validator包安裝:
go get -u github.com/go-playground/validator/v10
導(dǎo)入validator:
import "github.com/go-playground/validator/v10"
validator 應(yīng)用了 Golang
的 Struct Tag
和 Reflect
機(jī)制,基本思想是:在 Struct Tag
中為不同的字段定義各自類(lèi)型的約束,然后通過(guò) Reflect
獲取這些約束的類(lèi)型信息并在校驗(yàn)器中進(jìn)行數(shù)據(jù)校驗(yàn)。
示例:
package main import ( "fmt" "github.com/go-playground/validator/v10" ) type User struct { UserName string `json:"user_name" validate:"required"` Password string `json:"password" validate:"required,min=6,max=20"` } func main() { example := User{ Password: "123", } //實(shí)例化驗(yàn)證器 validate := validator.New() errs := validate.Struct(example) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { fmt.Println(err) } } }
validator包的驗(yàn)證提示默認(rèn)是英文的,輸出如下:
這樣看可能不太清楚,如果需要翻譯成中文則還需安裝驗(yàn)證提示翻譯包:
go get -u github.com/go-playground/locales go get -u github.com/go-playground/universal-translator
修改后如下:
package main import ( "fmt" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zh_translations "github.com/go-playground/validator/v10/translations/zh" ) type User struct { UserName string `json:"user_name" validate:"required"` Password string `json:"password" validate:"required,min=6,max=20"` } func main() { example := User{ Password: "123", } // 中文翻譯器 uni := ut.New(zh.New()) trans, _ := uni.GetTranslator("zh") //實(shí)例化驗(yàn)證器 validate := validator.New() // 注冊(cè)翻譯器到校驗(yàn)器 err := zh_translations.RegisterDefaultTranslations(validate, trans) if err!=nil { fmt.Println(err) return } errs := validate.Struct(example) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { fmt.Println(err.Translate(trans)) } } }
執(zhí)行輸出:
下面列舉一部分我們開(kāi)發(fā)中經(jīng)常用到的驗(yàn)證規(guī)則
Tag | 說(shuō)明 | 示例 |
---|---|---|
required | 必填 | Field或Struct validate:"required" |
omitempty | 空時(shí)忽略 | Field或Struct validate:"omitempty" |
len | 長(zhǎng)度 | Field validate:"len=0" |
eq | 等于 | Field validate:"eq=0" |
gt | 大于 | Field validate:"gt=0" |
gte | 大于等于 | Field validate:"gte=0" |
lt | 小于 | Field validate:"lt=0" |
lte | 小于等于 | Field validate:"lte=0" |
min | 最小值 | Field validate:"min=1" |
max | 最大值 | Field validate:"max=2" |
required_with | 其他字段其中一個(gè)不為空且當(dāng)前字段不為空 | Field validate:"required_with=Field1 Field2" |
required_without | 其他字段其中一個(gè)為空且當(dāng)前字段不為空 | Field `validate:“required_without=Field1 Field2” |
lowercase | 符串值是否只包含小寫(xiě)字符 | Field validate:"lowercase" |
uppercase | 符串值是否只包含大寫(xiě)字符 | Field validate:"uppercase" |
字符串值包含一個(gè)有效的電子郵件 | Field validate:"email" | |
json | 字符串值是否為有效的JSON | Field validate:"json" |
url | 符串值是否包含有效的url | Field validate:"url" |
uri | 符串值是否包含有效的 uri | Field validate:"uri" |
contains | 字符串值包含子字符串值 | Field validate:"contains=@" |
excludes | 字符串值不包含子字符串值 | 字符串值不包含子字符串值 Field validate:"excludes=@" |
ip | 字符串值是否包含有效的 IP 地址 | Field validate:"ip" |
datetime | 字符串值是否包含有效的日期 | Field validate:"datetime" |
startswith | 字符串以提供的字符串值開(kāi)始 | Field validate:"startswith=abc" |
endswith | 字符串以提供的字符串值結(jié)束 | Field validate:"endswith=abc" |
validator 允許定義跨字段驗(yàn)證,即:驗(yàn)證某個(gè)字段與其他字段之間的關(guān)系。這種驗(yàn)證實(shí)際上分為兩種:
一種是參數(shù)字段就是同一個(gè)結(jié)構(gòu)體中的平級(jí)字段。
另一種是參數(shù)字段為結(jié)構(gòu)中其他字段的字段。
驗(yàn)證語(yǔ)法很簡(jiǎn)單,如果是驗(yàn)證同一個(gè)結(jié)構(gòu)中的字段,則在基礎(chǔ)的 Tags 后面添加一個(gè) field 后綴,例如:eqfield 定義字段間的相等(eq)約束。如果是更深層次的字段,在 field 之前還需要加上 cs(Cross-Struct),eq 就變?yōu)榱?eqcsfield。
eqfield=Field:必須等于 Field 的值。
nefield=Field:必須不等于 Field 的值。
gtfield=Field:必須大于 Field 的值。
gtefield=Field: 必須大于等于 Field 的值。
ltfield=Field:必須小于 Field 的值。
ltefield=Field:必須小于等于 Field 的值。
eqcsfield=Other.Field:必須等于 struct Other 中 Field 的值。
necsfield=Other.Field:必須不等于 struct Other 中 Field 的值。
gtcsfield=Other.Field:必須大于 struct Other 中 Field 的值;
gtecsfield=Other.Field:必須大于等于 struct Other 中 Field 的值。
ltcsfield=Other.Field:必須小于 struct Other 中 Field 的值。
ltecsfield=Other.Field:必須小于等于 struct Other 中 Field 的值。
另外還有幾個(gè)常用的 Tag:
required_with=Field1 Field2:在 Field1 或者 Field2 存在時(shí),必須;
required_with_all=Field1 Field2:在 Field1 與 Field2 都存在時(shí),必須;
required_without=Field1 Field2:在 Field1 或者 Field2 不存在時(shí),必須;
required_without_all=Field1 Field2:在 Field1 與 Field2 都存在時(shí),必須;
通過(guò)看源碼,我們可以看到validator 返回的錯(cuò)誤有兩種,一種是參數(shù)錯(cuò)誤,一種是校驗(yàn)錯(cuò)誤,它們都實(shí)現(xiàn)了 error 接口。
參數(shù)錯(cuò)誤時(shí),返回 InvalidValidationError 類(lèi)型;
校驗(yàn)錯(cuò)誤時(shí),返回 ValidationErrors 類(lèi)型。ValidationErrors 是一個(gè)錯(cuò)誤切片,保存了每個(gè)字段違反的每個(gè)約束信息。
所以 validator 校驗(yàn)返回的結(jié)果有 3 種情況:
nil:沒(méi)有錯(cuò)誤;
InvalidValidationError:輸入?yún)?shù)錯(cuò)誤;
ValidationErrors:字段違反約束。
validator 返回的錯(cuò)誤有兩種,一種是參數(shù)錯(cuò)誤,一種是校驗(yàn)錯(cuò)誤,它們都實(shí)現(xiàn)了 error 接口。
參數(shù)錯(cuò)誤時(shí),返回 InvalidValidationError 類(lèi)型;
校驗(yàn)錯(cuò)誤時(shí),返回 ValidationErrors 類(lèi)型。ValidationErrors 是一個(gè)錯(cuò)誤切片,保存了每個(gè)字段違反的每個(gè)約束信息。
所以 validator 校驗(yàn)返回的結(jié)果只有 3 種情況:
nil:沒(méi)有錯(cuò)誤;
InvalidValidationError:輸入?yún)?shù)錯(cuò)誤;
ValidationErrors:字段違反約束。
我們可以在程序中判斷 err != nil
時(shí),可以依次將 err轉(zhuǎn)換為 InvalidValidationError
和 ValidationErrors
以獲取更詳細(xì)的信息:
err := validate.Struct(user) if err != nil { invalid, ok := err.(*validator.InvalidValidationError) if ok { fmt.Println("param error:", invalid) return } validationErrs := err.(validator.ValidationErrors) for _, validationErr := range validationErrs { fmt.Println(validationErr) } }
讀到這里,這篇“Golang驗(yàn)證器之validator怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。