文章目錄
- 一、數據綁定:
- 二、數據驗證:
-
- 1. 使用:
- 2. 其他驗證器:
- 3. 自定義驗證器:
- 3.2 定義驗證器:
- 3.3 注冊驗證器:
- 3.4 結構體中使用:
- 4. beego中的驗證器:
- 4.2 驗證方法:
- 4.3 通過 StructTag校驗數據:
-
- BindQuery\ShouldBindQuery函數只綁定查詢參數,而不綁定POST數據
- Bind\ShouldBind函數綁定Get 參數,綁定POST數據
一、數據綁定:
1. 數據綁定介紹:
Gin提供了兩類綁定方法:
- Must bind:
- Methods:
Bind, BindJSON, BindXML, BindQuery, BindYAML
- Behavior:
- 這些方法屬於MustBindWith的具體調用. 如果發生綁定錯誤, 則請求終止, 並觸發
c.AbortWithError(400, err).SetType(ErrorTypeBind)
響應狀態碼被設置為 400 並且Content-Type被設置為text/plain; charset=utf-8
. 如果您在此之后嘗試設置響應狀態碼, Gin會輸出日志[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422
. 如果您希望更好地控制綁定, 考慮使用ShouldBind等效方法.
- 這些方法屬於MustBindWith的具體調用. 如果發生綁定錯誤, 則請求終止, 並觸發
- Methods:
- Should bind:
- Methods:
ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML
- Behavior:
- 這些方法屬於ShouldBindWith的具體調用. 如果發生綁定錯誤, Gin 會返回錯誤並由開發者處理錯誤和請求.
- Methods:
2. 數據綁定–Should bind:
2.1 ShouldBind:
.
├── chapter05
│ └── bind_form.go
├── main.go
├── static
├── template
│ ├── chapter05
│ │ └── user_add.html
./main.go
package main import ( "gin_project/chapter05" "github.com/gin-gonic/gin" ) func main() { engine := gin.Default() // 注冊模板 engine.LoadHTMLGlob("template/**/*") // 注冊靜態文件 engine.Static("./static", "static") // 注冊路由 engine.GET("/to_bindform", chapter05.ToBindform) engine.POST("/push_bindform", chapter05.DoBindform) engine.GET("/push_bindquery", chapter05.DoBindquery) // http://localhost:9000/push_bindquery?name=zhangsan&age=110&addr=%E5%8C%97%E4%BA%AC engine.POST("/push_bindajax", chapter05.DoBindajax) engine.Run(":9000") }
- ./chapter05/bind_form.go
package chapter05 import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) type User struct { Name string `form:"name" json:"name"` Age int `form:"age" json:"age"` Addr string `form:"addr" json:"addr"` } func ToBindform(ctx *gin.Context) { ctx.HTML(http.StatusOK, "chapter05/user_add.html", nil) } // bind form data func DoBindform(ctx *gin.Context) { var user User err := ctx.ShouldBind(&user) fmt.Println(user) if err != nil { ctx.String(http.StatusNotFound, "綁定form失敗") } else { ctx.String(http.StatusOK, "綁定form成功") } } // bind Query data func DoBindquery(ctx *gin.Context) { var user User err := ctx.ShouldBind(&user) fmt.Println(user) if err != nil { ctx.String(http.StatusNotFound, "綁定query失敗") } else { ctx.String(http.StatusOK, "綁定query成功") } } // bind Ajax data func DoBindajax(ctx *gin.Context) { var user User err := ctx.ShouldBind(&user) fmt.Println(user) if err != nil { ctx.String(http.StatusNotFound, "綁定ajax失敗") } else { ctx.String(http.StatusOK, "綁定ajax成功") } }
./template/chapter05/user_add.html
{{ define "chapter05/user_add.html" }}
<!DOCTYPE html> <html lang="zh"> <head> <title>post請求練習</title> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <style> .userForm { width: 480px; height: 360px; margin: 20px 200px; } input { margin: 5px 0; } </style> </head> <body> <div class="userForm"> <h2>bind form data</h2> <form action="/push_bindform" method="post"> <p>姓名:<input type="text" name="name" id="name"></p> <p>年齡:<input type="text" name="age" id="age"></p> <p>地址:<input type="text" name="addr" id="addr"></p> <p><input type="submit" value="提交form"></p> <p><input type="button" value="提交ajax" id="sub-btn"></p> </form> </div> <script> // 使用ajax提交json var btn