<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於HTTP請求,我們要在腦子裡有一個根深蒂固的概念,那就是任何使用者端傳過來的資料都是不可信任的。那麼開發介面的時候需要對使用者端傳提交的引數進行引數校驗,如果提交的引數只有一個兩個,這樣我們可以簡單寫個if判斷,那麼要是有很多的引數校驗,那麼滿屏都是引數校驗的if判斷,效率不僅低還不美觀,接下來我們介紹一個引數校驗器validator
。
Validator
是一個 Golang 的第三方庫,用於對資料進行校驗,常用於 API 的開發中,對使用者端發出的請求資料進行嚴格校驗,防止惡意請求。
validator包安裝:
go get -u github.com/go-playground/validator/v10
匯入validator:
import "github.com/go-playground/validator/v10"
validator 應用了 Golang
的 Struct Tag
和 Reflect
機制,基本思想是:在 Struct Tag
中為不同的欄位定義各自型別的約束,然後通過 Reflect
獲取這些約束的型別資訊並在校驗器中進行資料校驗。
範例:
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", } //範例化驗證器 validate := validator.New() errs := validate.Struct(example) if errs != nil { for _, err := range errs.(validator.ValidationErrors) { fmt.Println(err) } } }
validator包的驗證提示預設是英文的,輸出如下:
這樣看可能不太清楚,如果需要翻譯成中文則還需安裝驗證提示翻譯包:
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") //範例化驗證器 validate := validator.New() // 註冊翻譯器到校驗器 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)) } } }
執行輸出:
下面列舉一部分我們開發中經常用到的驗證規則,詳細驗證規則可以參考檔案:
https://pkg.go.dev/gopkg.in/go-playground/validator.v10
Tag | 說明 | 範例 |
---|---|---|
required | 必填 | Field或Struct validate:"required" |
omitempty | 空時忽略 | Field或Struct validate:"omitempty" |
len | 長度 | 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 | 其他欄位其中一個不為空且當前欄位不為空 | Field validate:"required_with=Field1 Field2" |
required_without | 其他欄位其中一個為空且當前欄位不為空 | Field `validate:“required_without=Field1 Field2” |
lowercase | 符串值是否只包含小寫字元 | Field validate:"lowercase" |
uppercase | 符串值是否只包含大寫字元 | Field validate:"uppercase" |
字串值包含一個有效的電子郵件 | 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 | 字串以提供的字串值開始 | Field validate:"startswith=abc" |
endswith | 字串以提供的字串值結束 | Field validate:"endswith=abc" |
validator 允許定義跨欄位驗證,即:驗證某個欄位與其他欄位之間的關係。這種驗證實際上分為兩種:
驗證語法很簡單,如果是驗證同一個結構中的欄位,則在基礎的 Tags 後面新增一個 field 字尾,例如:eqfield 定義欄位間的相等(eq)約束。如果是更深層次的欄位,在 field 之前還需要加上 cs(Cross-Struct),eq 就變為了 eqcsfield。
另外還有幾個常用的 Tag:
通過看原始碼,我們可以看到validator 返回的錯誤有兩種,一種是引數錯誤,一種是校驗錯誤,它們都實現了 error 介面。
所以 validator 校驗返回的結果有 3 種情況:
validator 返回的錯誤有兩種,一種是引數錯誤,一種是校驗錯誤,它們都實現了 error 介面。
引數錯誤時,返回 InvalidValidationError 型別;
校驗錯誤時,返回 ValidationErrors 型別。ValidationErrors 是一個錯誤切片,儲存了每個欄位違反的每個約束資訊。
所以 validator 校驗返回的結果只有 3 種情況:
nil:沒有錯誤;
InvalidValidationError:輸入引數錯誤;
ValidationErrors:欄位違反約束。
我們可以在程式中判斷 err != nil
時,可以依次將 err轉換為 InvalidValidationError
和 ValidationErrors
以獲取更詳細的資訊:
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) } }
通過以上的內容我們瞭解了validator
一些基本的功能和用法,在我們開發中大大提高了開發效率。
validator
功能非常豐富,使用較為簡單方便。它的應用非常廣泛,建議瞭解一下。
到此這篇關於Golang驗證器之validator是使用詳解的文章就介紹到這了,更多相關Golang validator內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45