91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang GinWeb之怎么請求參數綁定和驗證

發布時間:2021-10-23 16:04:20 來源:億速云 閱讀:295 作者:iii 欄目:web開發

這篇文章主要講解了“Golang GinWeb之怎么請求參數綁定和驗證”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang GinWeb之怎么請求參數綁定和驗證”吧!

模型綁定和驗證

使用模型綁定來綁定請求體到一個Go類型上. 目前支持JSON,XML,YAML以及標準表單(如foo=bar&boo=baz)的綁定.

Gin使用go-playground/validator/v10包來驗證請求,  關于tags在驗證中使用詳見(https://godoc.org/github.com/go-playground/validator#hdr-Baked_In_Validators_and_Tags)

注意:綁定前請確認結構體中需要綁定的字段標簽與綁定類型一致,比如綁定JSON,設置標簽: json:"fieldname"

Gin提供兩種方式(類型)來完成綁定:

Must bind

1. 方法: Bind, BindJSON, BindXML, BindQuery, BindYAML, BindHeader

2. 特點: 這些方法底層使用MustBindWith方法. 如果出現綁定錯誤,  請求將以狀態碼400返回失敗信息:c.AbortWithError(400, err).SetType(ErrorTypeBind),  響應中設置Content-Type頭為text/plain; charset=utf-8.如果手動設置響應碼,會警告響應頭已經設置,比如提示:  [GIN-debug] [WARNING] Headers were already written. Wanted to override status  code 400 with 422, 如果想要更好的控制這些行為,建議使用下面對應的ShoudBind方法.

Should bind

1. 方法: ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery,  ShouldBindYAML, ShouldBindHeader

2. 特點: 這些方法底層使用ShouldBindWith. 如果出現綁定錯誤, 會返回錯誤, 開發者可以控制和恰當的處理這些錯誤.

當使用綁定方法時, Gin嘗試根據類型頭Content-Type header自動推斷要使用的綁定器.  如果你已經確認需要綁定的類型,可以直接使用底層的MustBindWith或ShouldBindWith方法.

你也可以針對特殊的字段指定required標簽值, 如果某個字段指定了:binding:"required"標簽,  但是在綁定時該字段為空會返回錯誤.

如以下代碼綁定JSON:

package main  import (   "github.com/gin-gonic/gin"   "net/http" )  // Binding from JSON type Login struct {   User string `form:"user" json:"user" xml:"user"  binding:"required"` //分別定義form,json,xml,binding等標簽   //Password string `form:"password" json:"password" xml:"password" binding:"required"`   Password string `form:"password" json:"password" xml:"password" binding:"-"` }  func main() {   router := gin.Default()    // Example for binding JSON ({"user": "manu", "password": "123"})   router.POST("/loginJSON", func(c *gin.Context) {     var json Login     if err := c.ShouldBindJSON(&json); err != nil {       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})       return     }      if json.User != "manu" || json.Password != "123" {       c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})       return     }      c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})   })    // Example for binding XML (   //  <?xml version="1.0" encoding="UTF-8"?>   //  <root>   //    <user>user</user>   //    <password>123</password>   //  </root>)   router.POST("/loginXML", func(c *gin.Context) {     var xml Login     if err := c.ShouldBindXML(&xml); err != nil {       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})       return     }      if xml.User != "manu" || xml.Password != "123" {       c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})       return     }      c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})   })    // Example for binding a HTML form (user=manu&password=123)   router.POST("/loginForm", func(c *gin.Context) {     var form Login     // This will infer what binder to use depending on the content-type header.     if err := c.ShouldBind(&form); err != nil {       c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})       return     }      if form.User != "manu" || form.Password != "123" {       c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})       return     }      c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})   })    // Listen and serve on 0.0.0.0:8080   router.Run(":8080") }  //模擬請求: curl -v -X POST http://localhost:8080/loginJSON -H 'content-type: application/json' -d '{ "user": "manu", "password": "123" }'

跳過驗證: 與binding:"required"標簽對應的是binding:"-", 表示該字段不做綁定, 所以綁定時該字段為空不會報錯.

自定義驗證器

你也可以自己注冊一個自定義驗證器,  示例代碼請參考(https://github.com/gin-gonic/examples/blob/master/custom-validation/server.go)

package main  import (   "net/http"   "time"    "github.com/gin-gonic/gin"   "github.com/gin-gonic/gin/binding"   "github.com/go-playground/validator/v10" )  // Booking contains binded and validated data. // Booking結構中定義了包含綁定器和日期驗證器標簽 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"`  //gtfield=CheckIn表示結賬時間必須大于登記時間 }  // 定義日期驗證器 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) {  //如果當前時間在checkIn字段時間之后,返回false,即登記時間不能早于當前的時間       return false     }   }   return true }  func main() {   route := gin.Default()   //對binding.Validator.Engine()接口進行類型斷言,斷言類型為Validate結構,如果斷言成功,就將自定義的驗證器注冊到Gin內部   if v, ok := binding.Validator.Engine().(*validator.Validate); ok {     // - if the key already exists, the previous validation function will be replaced. 該注冊方法會將已經存在的驗證器替換     // - this method is not thread-safe it is intended that these all be registered prior to any validation     // 注冊方法不是線程安全的, 在驗證開始前,需要保證所有的驗證器都注冊成功     v.RegisterValidation("bookabledate", bookableDate)   }    route.GET("/bookable", getBookable)   route.Run(":8085") }  func getBookable(c *gin.Context) {   var b Booking   if err := c.ShouldBindWith(&b, binding.Query); err == nil {     c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"})   } else {     c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})   } }  //模擬請求: // 登記時間和結賬時間符合條件 //$ curl "localhost:8085/bookable?check_in=2030-04-16&check_out=2030-04-17" //{"message":"Booking dates are valid!"} // // 登記時間在結賬時間之后, 不滿足gtfield校驗規則 //$ curl "localhost:8085/bookable?check_in=2030-03-10&check_out=2030-03-09" //{"error":"Key: 'Booking.CheckOut' Error:Field validation for 'CheckOut' failed on the 'gtfield' tag"} // // 登記時間在當前時間之前,不滿足自定義的驗證器 //$ curl "localhost:8085/bookable?check_in=2000-03-09&check_out=2000-03-10" //{"error":"Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'bookabledate' tag"}%

另外結構體級別的驗證采用如下的方式注冊, v.RegisterStructValidation(UserStructLevelValidation,  User{}), 請參考struct-lvl-validation  example(https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations)

感謝各位的閱讀,以上就是“Golang GinWeb之怎么請求參數綁定和驗證”的內容了,經過本文的學習后,相信大家對Golang GinWeb之怎么請求參數綁定和驗證這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巩义市| 扶沟县| 新野县| 徐水县| 荥经县| 龙川县| 淮南市| 淄博市| 浠水县| 平凉市| 广东省| 涞水县| 潢川县| 喀喇| 陵川县| 库尔勒市| 新沂市| 凌云县| 阿勒泰市| 买车| 石狮市| 新泰市| 黄石市| 思茅市| 霸州市| 怀来县| 平阳县| 牡丹江市| 台州市| 舟山市| 华池县| 柳河县| 葫芦岛市| 大庆市| 晋宁县| 襄樊市| 芦溪县| 彩票| 祁东县| 苍南县| 白水县|