1. 數據解析和綁定
bind或bindXXX函數(后文中我們統一都叫bind函數)的作用就是將請求體中的參數值綁定到對應的結構體上,以方便后續業務邏輯的處理
1.1 JSON數據解析和綁定
- 客戶端傳參,后端接收并解析到結構體
package mainimport ("github.com/gin-gonic/gin""log""net/http"
)///type Login struct {Username string `form:"username" json:"username" binding:"required" msg:"用戶名不能為空"`Password string `form:"password" json:"password" binding:"required"`
}///func demo(res *gin.Context) {var json Login// ShouldBind() msg:"用戶名不能為空"將request的body中的數據,自動按照json格式解析到結構體if err := res.ShouldBind(&json); err != nil {res.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}log.Println("user:", json.Username, "\n", "password:", json.Password)res.JSON(http.StatusOK, gin.H{})
}func main() {r := gin.Default()r.POST("/demo", demo)r.Run(":8080")
}
1.1.1 結構體分析
Password
使用了 binding:"required"
。
標簽中,binding標簽為其屬性設置了必填項
- 如果字符串為空:“”,ShouldBind,一樣會報400錯
- 如果使用
binding:"-"
, 就不會進行必填項檢驗了
1.2 form數據解析和綁定
package mainimport ("github.com/gin-gonic/gin""net/http"
)///type Login struct {Username string `form:"username" json:"測試" binding:"required" msg:"用戶名不能為空"`Password string `form:"password" binding:"required"`
}///func demo(res *gin.Context) {var json Login// Bind() 默認解析并綁定form格式// 根據請求頭中content-type自動推斷if err := res.Bind(&json); err != nil {res.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}//log.Println("user:", json.Username, "\n", "password:", json.Password)res.JSON(http.StatusOK, gin.H{"user": json.Username,"pass": json.Password,})
}func main() {r := gin.Default()r.POST("/demo", demo)r.Run(":8080")
}
1.3 URI數據解析和綁定
package mainimport ("github.com/gin-gonic/gin""net/http"
)///type Login struct {Username string `form:"username" json:"測試" binding:"required" msg:"用戶名不能為空"`Password string `form:"password" binding:"required"`
}///func demo(res *gin.Context) {var json Login// Bind() 默認解析并綁定form格式// 根據請求頭中content-type自動推斷if err := res.ShouldBindUri(&json); err != nil {res.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}//log.Println("user:", json.Username, "\n", "password:", json.Password)res.JSON(http.StatusOK, gin.H{"user": json.Username,"pass": json.Password,})
}func main() {r := gin.Default()r.POST("/demo", demo)r.Run(":8080")
}
1.4 綁定的方法區別
gin 為數據解析進行了多方面的設置,
面對不同的前端數據有統一的代碼處理方法。其本質上,還是將表單數據中每個數據的key值與結構中的數據一一對應。
- ShouldBindJSON()
- ShouldBindXML()
- ShouldBind()
- …
翻閱context的源碼,就能看到Bind和ShouldBind這兩類方法
ShouldBind() | Bind() |
---|---|
只會返回錯誤信息,不會往header里面寫400的錯誤狀態碼 | 返回錯誤,并在header里面寫400的狀態碼 |
這是兩者最大的差異,是否會在header中添加400的錯誤狀態碼
2. ??GoGin框架——前文鏈接
Gin框架學習參考網站:gin框架·Go語言中文文檔
- (Go Gin)基于Go的WEB開發框架,GO Gin是什么?怎么啟動?本文給你答案
- (Go Gin)Gin學習筆記(二):路由配置、基本路由、表單參數、上傳單個文件、上傳多個文件、淺扒路由原理
3. 💕👉博客專欄
- Golang專欄-包含基礎、Gin、Goam等知識
- 云原生專欄-包含k8s、docker等知識
- 從0開始學習云計算-華為HCIP證書
- JUC專欄-帶你快速領悟JUC的知識!
- JVM專欄-深入Java虛擬機,理解JVM的原理
- 基于Java研究 數據結構與算法-包含貪心算法、加權圖、最短路徑算法等知識
- Docker專欄-上手熱門容器技術Docker
- SpringBoot專欄-學習SpringBoot快速開發后端
- 項目管理工具的學習-設計技術:Maven、Git、Gradle等相關管理工具
- JavaSE-全面了解Java基礎
- JS專欄-使用JS作的一部分實例~
- 使用CSS所作的一部分案例