国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Gin 框架怎么使用自定義驗證器?

開發 前端
本文我們介紹 Gin 框架怎么使用自定義驗證器,分別列舉了字段級別和結構體級別自定義驗證器的使用方式。需要注意的是,它們并不是線程安全的,需要在任何驗證之前,先注冊自定義驗證器。

1.介紹

Gin 框架自定義驗證器,分為字段級別驗證器和結構體級別驗證器。

其中結構體級別驗證器,可以用于跨字段驗證,也可以用于和字段級別驗證器結合使用。

需要注意的是,結構體級別驗證器的優先級小于字段級別驗證器。

2.字段級別自定義驗證器

定義字段級別驗證器

示例代碼:

var userValidator validator.Func = func(fl validator.FieldLevel) bool {
 val, ok := fl.Field().Interface().(string)
 if ok {
  illegalName := []string{"admin", "Admin", "guest", "Guest"}
  for _, v := range illegalName {
   if v == val {
    return false
   }
  }
 }
 return true
}

閱讀上面這段代碼,我們定義一個 validator.Func 類型的函數變量,參數入參的類型是 validator.FieldLevel,返回結果是一個 bool 類型的變量。

函數體中,使用類型斷言,獲取字段的值,然后進行邏輯驗證。

注冊自定義驗證器

示例代碼:

func main() {
 r := gin.Default()
 // 注冊自定義驗證器
 if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
  err := v.RegisterValidation("user_validator", userValidator)
  if err != nil {
   return
  }
 }
 r.GET("/login", Login)
 err := r.Run()
 if err != nil {
  return
 }
}

閱讀上面這段代碼,我們使用 RegisterValidation 方法,注冊自定義驗證器 userValidator,該方法接收的第一個參數是用于結構體字段的 tag 名稱,第二個參數是自定義驗證器的函數名稱。

需要注意的是,如果我們注冊的驗證器標簽名(用于結構體字段的 tag 名稱)已存在,則會被當前驗證器函數替換掉。

使用自定義驗證器

示例代碼:

func Login(c *gin.Context) {
 user := &User{}
 err := c.ShouldBind(user)
 if err != nil {
  c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  return
 }
 c.JSON(http.StatusOK, gin.H{
  "data": user,
 })
}

type User struct {
 Name     string `form:"name" binding:"required,user_validator"`
 Password string `form:"password"`
}

閱讀上面這段代碼,我們在請求參數結構體的字段中,添加我們注冊自定義驗證器時的標簽名 user_validator,即可使用自定義驗證器。

輸出結果:

curl -s -X GET http://127.0.0.1:8080/login\?name\=admin\&password\=123456 | jq
{
  "error": "Key: 'User.Name' Error:Field validation for 'Name' failed on the 'user_validator' tag"
}

3.結構體級別自定義驗證器

定義結構體級別驗證器

示例代碼:

func UserStructLevelValidation(sl validator.StructLevel) {
 user := sl.Current().Interface().(User)
 if len(user.TrueName) == 0 && len(user.NickName) == 0 {
  sl.ReportError(user.TrueName, "TrueName", "true_name", "true_name_or_nick_name", "")
  sl.ReportError(user.TrueName, "NickName", "nick_name", "true_name_or_nick_name", "")
 }
}

閱讀上面這段代碼,我們定義一個函數,該函數接收一個 validator.StructLevel 類型的參數,函數體中使用類型斷言,獲取結構體的值,然后進行邏輯驗證。

注冊自定義驗證器

示例代碼:

func main() {
 r := gin.Default()
 // 注冊自定義驗證器
 if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
  v.RegisterStructValidation(UserStructLevelValidation, User{})
 }
 r.POST("/register", Register)
 err := r.Run()
 if err != nil {
  return
 }
}

閱讀上面這段代碼,我們使用 RegisterStructValidation 方法,注冊自定義驗證器 UserStructLevelValidation,該方法接收兩個參數,分別是 StructLevelFunc 函數類型的自定義驗證器,和需要驗證的結構體類型。

使用自定義驗證器

示例代碼:

func Register(c *gin.Context) {
 var user User
 err := c.ShouldBind(&user)
 if err != nil {
  c.JSON(http.StatusBadRequest, gin.H{
   "error": err.Error(),
  })
  return
 }
 c.JSON(http.StatusOK, gin.H{
  "data": user,
 })
}

type User struct {
 TrueName string `json:"true_name"`
 NickName string `json:"nick_name"`
 Password string `json:"password" binding:"required"`
}

閱讀上面這段代碼,我們不需要在結構體字段標簽中有任何操作,即可使用自定義結構體級別的驗證器。

以下是結構體級別驗證器單獨使用,和結合字段級別驗證器(標簽驗證器)一起使用的輸出結果。

輸出結果:

curl -s -H "content-type: application/json" -X POST -d '{"true_name": "", "nick_name": "", "password": "123456"}' http://127.0.0.1:8080/register | jq
{
  "error": "Key: 'User.TrueName' Error:Field validation for 'TrueName' failed on the 'true_name_or_nick_name' tag\nKey: 'User.NickName' Error:Field validation for 'NickName' failed on the 'true_name_or_nick_name' tag"
}

curl -s -H "content-type: application/json" -X POST -d '{"true_name": "", "nick_name": "", "password": ""}' http://127.0.0.1:8080/register | jq  
{
  "error": "Key: 'User.Password' Error:Field validation for 'Password' failed on the 'required' tag\nKey: 'User.TrueName' Error:Field validation for 'TrueName' failed on the 'true_name_or_nick_name' tag\nKey: 'User.NickName' Error:Field validation for 'NickName' failed on the 'true_name_or_nick_name' tag"
}

4.總結

本文我們介紹 Gin 框架怎么使用自定義驗證器,分別列舉了字段級別和結構體級別自定義驗證器的使用方式。

需要注意的是,它們并不是線程安全的,需要在任何驗證之前,先注冊自定義驗證器。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2025-03-31 01:30:00

Gin框架模型

2024-12-09 00:00:15

Gin框架中間件

2023-10-24 13:48:50

自定義注解舉值驗證

2009-02-10 12:55:39

自定義控件AJAX.NET

2024-11-11 00:45:54

Gin框架字段

2009-06-25 14:53:35

自定義UI組件JSF框架

2021-01-14 19:04:36

框架數據庫mybatis

2019-12-25 11:47:27

LinuxFVWM

2010-10-25 16:05:07

oracle自定義函數

2009-06-23 11:35:44

JSF的Naviati

2022-01-14 09:17:13

PythonAPISIX插件

2022-05-07 10:22:32

JavaScript自定義前端

2009-07-07 14:32:47

JDK日志Formatter

2009-11-24 15:11:21

ASP.NET MVC

2015-02-12 15:33:43

微信SDK

2021-05-28 08:58:41

Golang網卡metrics

2024-02-19 07:40:10

2009-07-07 14:00:25

JDK日志Handler

2021-10-28 08:39:22

Node Export自定義 監控

2022-09-13 15:44:52

VSLook插件
點贊
收藏

51CTO技術棧公眾號

激情视频一区二区| 国产成人免费观看| 美乳在线观看| 亚洲综合五月| 日韩av综合网站| 日韩精品不卡| 欧美a大片欧美片| 欧美日韩一区久久| www..com日韩| 亚洲精品乱码日韩| 亚洲欧美电影一区二区| 97在线看福利| 在线观看h网| 久久99久久久久久久久久久| 制服丝袜亚洲网站| 国产宾馆自拍| 精品日韩免费| 精品国产免费视频| 午夜伦伦电影理论片费看| 成人看片黄a免费看视频| 日韩美女一区二区三区四区| 欧美国产视频一区| 91九色鹿精品国产综合久久香蕉| 性久久久久久久| 欧美国产综合视频| 丁香婷婷久久| 欧美丰满美乳xxx高潮www| 欧美日韩另类综合| 亚洲视频免费| 国内精品久久久久伊人av| 国产极品一区| 国产一区二区免费看| 无夜福利视频观看| 午夜在线视频观看日韩17c| 日本黄色一区二区| 美女精品视频一区| 日本成本人片免费观看| 老司机亚洲精品一区二区| 日本欧洲一区二区| 麻豆国产精品va在线观看不卡| 中文字幕第12页| 新67194成人永久网站| 黄网av在线| 日韩av中文字幕第一页| 国产亚洲一区精品| 国产一区二区电影在线观看| 国产不卡视频在线| 欧美一区二区| www.亚洲成人网| 亚洲欧美在线另类| 免费在线激情视频| 国产精品你懂的| 欧美日韩女优| 国产精品久久综合av爱欲tv| 亚洲精品456| 国产亚洲欧美一区二区| 欧美hentaied在线观看| 中文字幕日本最新乱码视频| 欧美午夜精品久久久久久人妖 | 国产不卡视频一区二区三区| 久久这里只有精品23| 亚洲一区二区综合| 男女视频在线| 国内精品伊人久久| 午夜精品久久久久久久四虎美女版| 久中文字幕一区| 中文字幕在线观看不卡| 久操av在线| 一区二区中文字幕| 亚洲国产黄色| 中文字幕www| 3d成人动漫网站| 91综合久久爱com| 久久最新免费视频| 精品久久久久久中文字幕一区奶水| 亚洲一级少妇| 日韩免费毛片| 亚洲一区在线免费观看| 欧美综合影院| 成人激情在线播放| www激情久久| 成人直播视频| 成人免费大片黄在线播放| 一个色在线综合| 成人免费直播在线| 成人中文字幕在线播放| 亚洲精品久久7777777| 日韩**一区毛片| 欧美精品videosex| 亚洲一二三区精品| 3d动漫精品啪啪一区二区竹菊 | 天堂va欧美ⅴa亚洲va一国产| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲午夜精品网| 禁断一区二区三区在线| 国内福利写真片视频在线| 国产精品极品美女粉嫩高清在线| 久久九九影视网| av成人app永久免费| 婷婷福利视频导航| 成人性教育视频在线观看| 亚洲一区视频在线| 欧美亚洲tv| 国产一级大片| 日韩免费观看网站| 一区二区在线观看免费| 亚洲欧美亚洲| 都市激情亚洲一区| 99视频在线视频| 美女精品视频一区| 99久久婷婷国产综合精品电影 | 天堂资源中文在线| 欧美日韩综合精品| 欧美第一淫aaasss性| 欧美日韩在线一区| 一区在线免费观看| 免费观看在线一区二区三区| 亚州av影院| 欧洲成人在线观看| 91黄色免费网站| 成人天堂资源www在线| 久久精品福利| 电影k8一区二区三区久久| 成人黄色片视频| 国产精品久久久久久久天堂| 5月丁香婷婷综合| 丰满亚洲少妇av| 日韩图片一区| 日韩电影在线观看完整免费观看| 91在线中文| 免费看日b视频| 99在线看视频| 国产成人精品免高潮在线观看| 日韩欧美一区在线| 婷婷久久综合九色国产成人 | 亚洲韩日在线| 精品一区不卡| 日本中文字幕在线2020| 中文字幕在线中文| 国产伦精品一区二区三| 欧美一级片在线播放| 亚洲精品国产精品乱码不99按摩 | 色视频一区二区三区| 国产成人精品一区二区三区| 日韩中文字幕视频| 欧美精品 国产精品| 欧美天堂在线观看| 亚洲不卡在线观看| 亚洲视频图片小说| ●精品国产综合乱码久久久久| 久久成人久久鬼色| 国产一区二区三区综合| 久久久综合网| 亚洲一区二区免费看| 日韩欧美高清在线播放| 亚洲国产91视频| 蜜芽在线免费观看| 日本私人网站在线观看| 最新理论片影院| 美女视频免费观看网站在线| 国产激情片在线观看| 欧美做受777cos| 国产精品亚发布| 国产精品爱久久久久久久| 成人福利视频网| 欧美精品123| 老司机av福利| 男人亚洲天堂网| 国产福利一区视频| 免费福利片在线观看| 最近2018年手机中文在线| 在线观看h视频| 亚洲三级欧美| 亚洲免费福利一区| 免费黄色成人| 性欧美欧美巨大69| 石原莉奈在线亚洲二区| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲久草在线| 色吊丝一区二区| 九色精品91| 日本中文字幕一区| 久久久久成人黄色影片| 亚洲美女视频在线观看| 欧美日本精品一区二区三区| 中文字幕亚洲欧美一区二区三区 | 亚洲女同ⅹxx女同tv| 日本一区二区三级电影在线观看| 亚洲一区二区三区在线看| 精品久久久久久久久久久久久久久| 亚洲精品99久久久久| 国产欧美va欧美va香蕉在线| 国产一二三四五| 四虎电影院在线观看| 日本不卡一二三| 国产日韩欧美一区| 久久精品欧美一区二区三区不卡 | 久久久久久**毛片大全| 亚洲成av人片在线观看香蕉| 国产日韩在线精品av|