火影推薦程式連載59-基於gin的golang web開發:模型驗證
Gin除了模型繫結還提供了模型驗證功能。你可以給欄位指定特定的規則標籤,如果一個欄位用binding:"required"標籤修飾,在繫結時該欄位的值為空,那麼將返回一個錯誤。開發web api的時候大部分引數都是需要驗證的,比如email引數要驗證是否是郵箱格式、phone引數要驗證是否是手機號格式等等,使用模型驗證方法可以將驗證過程隔離在業務之外。
內建的驗證標籤
Gin通過整合go-playground/validator提供模型驗證功能,並提供了很多常用驗證規則可以滿足我們大部分的開發需求。我們通過一個例子看一下怎麼使用這些驗證標籤。
type AddUserRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"` // 登入密碼
Nickname string `json:"nickname" binding:"required"` // 暱稱
Mobile string `json:"mobile"` // 手機號
Email string `json:"email" binding:"required,email"` // 郵箱地址
}
func AddUser(c *gin.Context) {
req := sysUser.AddUserRequest{}
if err := c.ShouldBind(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
...
c.String(http.StatusOK, "")
}
在Username欄位上增加了binding:"required"標籤,代表gin會驗證引數為必填項,如果沒有為Username欄位提供值ShouldBind返回的err中會包含相應的錯誤內容。Email欄位增加了binding:"required,email"標籤,這是一個組合驗證,代表Email是必填項的同時還要是一個正確的郵箱格式的字串。
下面例子可以看到在未通過模型驗證時,介面返回的錯誤資訊。
請求:
{
"username":"",
"password":"123qwe",
"nickname": "暱稱",
"mobile": "13322323232",
"email": "",
"qq": "234123412312"
}
響應:
{
"error": "Key: 'AddUserRequest.Username' Error:Field validation for 'Username' failed on the 'required' tag\nKey: 'AddUserRequest.Email' Error:Field validation for 'Email' failed on the 'required' tag"
}
自定義驗證
有時候內建的驗證規則可能不能滿足業務需求,這樣就需要自定義驗證規則。大致兩個步驟,1.定義一個驗證方法。2.把這個方法註冊為驗證規則。
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)
}
...
}
這裡新增了一個叫做bookabledate的驗證規則,驗證一下引數是否大於今天。使用RegisterValidation("bookabledate", bookableDate)方法註冊為驗證規則,並且在CheckIn欄位上增加了binding:"required,bookabledate"標籤。如果驗證失敗會返回錯誤資訊:
Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'bookabledate' tag"
自定義錯誤訊息
目前錯誤訊息還是英文的,對於國內使用者很不友好,介面報錯的時候基本不可能把這種錯誤訊息返回給使用者看。go-playground/validator提供了錯誤資訊的翻譯,至少先解決英文錯誤的問題。在專案下新增validator/init.go檔案。
ptional<Integer> max www.jintianxuesha.com= list.stream(www.huiyinpp3zc.cn).max((a, b) -> a - b);
System.out.println(max.get(www.haoranjupt.com)); www.fudayulpt.cn// 6
//求集合的最小值
System.out.println(list.stream( www.jubooyule.com ).min((www.baihua178.cn b) -> a-b).get()); // 1
System.out.println(www.jucaiyle.cn list.stream(www.tengyueylzc.cn).count(www.baihuayllpt.cn));//
String str =www.qitianylezc.cn"11,22,33,44,55";
System.out.println(Stream.of(str.split(www.longtenghai2.com",")).mapToInt(www.wujiu5zhuce.cn-> Integer.valueOf(x)).sum());
System.out.println(Stream.of(str.split("www.lanboylgw.com,")).mapToInt(Integer::valueOf).sum());
System.out.println(Stream.of(str.split(www.shentuylzc.cn",")).map(x -> Integer.valueOf(x)).mapToInt(x -> x).sum());
System.out.println(Stream.of(str.split(www.xingyunylpt.com",")).map(Integer::valueOf).mapToInt(x -> x).su
在handler中呼叫validator.Translate方法獲取錯誤訊息的中文翻譯。
func AddUser(c *gin.Context) {
req := sysUser.AddUserRequest{}
if err := c.ShouldBind(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": validator.Translate(err)})
return
}
...
c.String(http.StatusOK, "")
}
這樣訪問介面時會看到中文的錯誤資訊:
{
"error": "Username為必填欄位;"
相關文章
- 基於gin的golang web開發:模型驗證GolangWeb模型
- 基於gin的golang web開發:模型繫結GolangWeb模型
- 基於gin的golang web開發:認證利器jwtGolangWebJWT
- 基於gin的golang web開發:路由GolangWeb路由
- 基於gin的golang web開發:dockerGolangWebDocker
- 基於gin的golang web開發:路由二GolangWeb路由
- 基於gin的golang web開發:Gin技術拾遺GolangWeb
- 基於gin的golang web開發:中介軟體GolangWeb
- 基於gin的golang web開發:服務間呼叫GolangWeb
- 基於gin的golang web開發:整合swaggerGolangWebSwagger
- 基於gin的golang web開發:mysql增刪改查GolangWebMySql
- 基於gin的golang web開發:使用資料庫事務GolangWeb資料庫
- 基於gin的golang web開發:訪問mysql資料庫GolangWebMySql資料庫
- 基於gin的golang web開發:實現使用者登入GolangWeb
- Gin 模型繫結驗證模型
- 基於gin的golang web開發:永遠不要相信使用者的輸入GolangWeb
- 基於Gin框架的web後端開發(八): Gin框架的請求重定向框架Web後端
- golang開發類庫推薦Golang
- 基於Gin框架的web後端開發(七): Gin框架的檔案上傳詳解框架Web後端
- 基於Golang的CLI 命令列程式開發Golang命令列
- 基於Gin框架的web後端開發(二): JSON資料生成框架Web後端JSON
- SSL證書是如何驗證的?驗證方式推薦
- 基於Gin框架的web後端開發(三): 獲取queryString引數框架Web後端
- golang開發:環境篇(五)實時載入工具gin的使用Golang
- 基於Gin框架的web後端開發(四): 獲取FORM表單引數框架Web後端ORM
- GOLANG Web請求引數驗證GolangWeb
- 基於深度學習模型Wide&Deep的推薦深度學習模型IDE
- golang web框架——gin使用教程(一)GolangWeb框架
- 基於物件特徵的推薦物件特徵
- 8個最佳Web開發資源推薦Web
- 基於Gin框架的web後端開發(十): Gin框架-中介軟體(定義、使用、通訊與例項)詳解框架Web後端
- 給 Web 開發人員推薦的文件生成工具Web
- 基於gin框架封裝的web專案骨架goskeleton框架封裝WebGo
- 基於go語言gin框架的web專案骨架Go框架Web
- 如何為「紐約時報」開發基於內容的推薦系統
- 推薦18個基於HTML5 Canvas 開發的圖表庫HTMLCanvas
- 推薦系統實踐 0x09 基於圖的模型模型
- 五星好評!基於uniapp開發的開源專案推薦APP