Gin中數(shù)據(jù)解析和綁定的幾種方法實(shí)現(xiàn)
概要
Gin數(shù)據(jù)解析和綁定可以分為三類
- Json數(shù)據(jù)的解析和綁定
- 表單數(shù)據(jù)的解析和綁定
- URI數(shù)據(jù)的解析和綁定
我們來分別講解各自的數(shù)據(jù)類型以及對應(yīng)的綁定和解析
Json數(shù)據(jù)解析和綁定
Json數(shù)據(jù)要解析到結(jié)構(gòu)體時(shí),需要在結(jié)構(gòu)體標(biāo)簽中用到j(luò)son標(biāo)簽,用于序列化Json數(shù)據(jù)并對應(yīng)到結(jié)構(gòu)體中
我們使用Context包下的ShouldBindJSON()方法將請求中傳遞的Json數(shù)據(jù)解析到結(jié)構(gòu)體中
代碼實(shí)現(xiàn)
type Login struct {
Username string `json:"username" form:"username" binding:"required"`
Password string `json:"password" form:"password" binding:"required"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var form Login
if err := c.ShouldBind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if form.Username != "root" || form.Password != "root" {
c.JSON(http.StatusBadRequest, gin.H{"error": "304"})
return
}
c.JSON(http.StatusOK, gin.H{"data": form})
})
r.Run(":8080")
}
}
注意:
在結(jié)構(gòu)體定義的時(shí)候一定要帶上json標(biāo)簽,json標(biāo)簽的作用是讓發(fā)送的json字符串?dāng)?shù)據(jù)能夠?qū)?yīng)到結(jié)構(gòu)體字段上。
ShouldBindJSON()的作用是什么?該方法可以將前端傳遞的json格式數(shù)據(jù)自動(dòng)解析到結(jié)構(gòu)體上,并配合結(jié)構(gòu)體中的json標(biāo)簽進(jìn)行精準(zhǔn)映射,簡化了數(shù)據(jù)綁定過程
測試
這里我使用的工具是ApiFox
在工具中發(fā)送post請求,這里我們需要使用json格式發(fā)送,不能用query參數(shù)

表單數(shù)據(jù)解析和綁定
什么是表單數(shù)據(jù)?很簡單,就是前端使用表單組件來提交數(shù)據(jù)的格式
表單數(shù)據(jù)也是鍵值對形式存儲(chǔ)的,并且不支持嵌套。 username=root&password=root
前端實(shí)現(xiàn)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080/login" method="post" enctype="application/x-www-form-urlencoded">
用戶名<input type="text" name="username">
密碼<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
這里指定了表單的編碼方式為enctype="application/x-www-form-urlencoded"
后端實(shí)現(xiàn)
這里我們可以使用ShouldBind()或者Bind()方法進(jìn)行數(shù)據(jù)解析
type Login struct {
Username string `form:"username" json:"username" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var form Login
fmt.Println(form)
if err := c.ShouldBind(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if form.Username != "root" || form.Password != "root" {
c.JSON(http.StatusBadRequest, gin.H{"error": "304"})
return
}
c.JSON(http.StatusOK, gin.H{"data": form})
})
r.Run(":8080")
}
注意
注意結(jié)構(gòu)體的標(biāo)簽中使用form標(biāo)簽,這樣配合ShouldBind()方法可以將表單數(shù)據(jù)解析到結(jié)構(gòu)體并對應(yīng)到相應(yīng)字段上
測試
打開本地創(chuàng)建的html文件,將前端代碼復(fù)制到文件中,保存后在瀏覽器中打開

這里我們的用戶名和密碼都是root
發(fā)送請求后,頁面應(yīng)該響應(yīng)出來一個(gè)json格式的數(shù)據(jù)

至于錯(cuò)誤的用戶名和密碼是什么效果,可以自行測試
URI數(shù)據(jù)解析和綁定
什么是URI?注意是uri,不是url。url是uri的子集,這里我們只需要知道uri可以是url,也就是我們訪問資源的時(shí)候,斜杠后邊的內(nèi)容,即訪問路徑。
比如
localhost:8080/login/root/root,這時(shí)候可以把uri看成url,并且我們可以通過shouldBindUri()將路徑中的兩個(gè)root進(jìn)行數(shù)據(jù)解析,解析到Login結(jié)構(gòu)體中,并且通過結(jié)構(gòu)體中的uri標(biāo)簽,將數(shù)據(jù)映射到對應(yīng)的結(jié)構(gòu)體字段上。
代碼實(shí)現(xiàn)
type Login struct {
Username string `form:"username" json:"username" uri:"username" binding:"required"`
Password string `form:"password" json:"password" uri:"password" binding:"required"`
}
func main() {
r := gin.Default()
r.GET("/:username/:password", func(c *gin.Context) {
var form Login
if err := c.ShouldBindUri(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if form.Username != "root" || form.Password != "root" {
c.JSON(http.StatusBadRequest, gin.H{"status": 304})
return
}
c.JSON(http.StatusOK, gin.H{"status": 200})
})
r.Run(":8080")
}
注意
結(jié)構(gòu)體中要帶上uri標(biāo)簽,這樣可以結(jié)合ShouldBindUri進(jìn)行數(shù)據(jù)綁定的簡化
測試
我們打開瀏覽器,輸入localhost:8080/root/root,這里和我們的代碼中定義的路徑對應(yīng),代碼中沒有寫login/:username/:password那我們請求時(shí)也不帶login,并且代碼中定義的只返回一個(gè)200狀態(tài)碼,這些內(nèi)容都可以根據(jù)實(shí)際情況進(jìn)行更改

此時(shí),三種類型的數(shù)據(jù)解析和綁定我們就都測試完畢
小結(jié)
從上邊的三個(gè)demo可以看到,gin處理這些不同類型的數(shù)據(jù)對應(yīng)了不同的方法,我們需要使用正確的方法進(jìn)行處理,保證了代碼的靈活性,也可以減少錯(cuò)誤率
到此這篇關(guān)于Gin中數(shù)據(jù)解析和綁定的幾種方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Gin中數(shù)據(jù)解析和綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
全面解析Golang 中的 Gorilla CORS 中間件正確用法
Golang 中使用 gorilla/mux 路由器配合 rs/cors 中間件庫可以優(yōu)雅地解決這個(gè)問題,然而,很多人剛開始使用時(shí)會(huì)遇到配置不生效的問題,本文將詳細(xì)介紹其正確用法,感興趣的朋友一起看看吧2025-07-07
使用Golang讀取toml配置文件的代碼實(shí)現(xiàn)
在開發(fā)過程中,配置文件是必不可少的一部分,它使我們能夠在不更改代碼的情況下更改應(yīng)用程序的行為,TOML是一種簡單易讀的配置文件格式,本文將介紹如何使用Golang來讀取TOML配置文件,需要的朋友可以參考下2024-04-04
Go語言實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹詳解
線段樹是一種用于高效處理區(qū)間查詢和區(qū)間更新的數(shù)據(jù)結(jié)構(gòu),下面我們就來看看如何使用Go實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹的方式,感興趣的可以了解下2025-02-02
深入理解Go gin框架中Context的Request和Writer對象
這篇文章主要為大家詳細(xì)介紹了Go語言的gin框架中Context的Request和Writer對象,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,快跟隨小編一起學(xué)習(xí)一下吧2023-04-04
Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式
這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Go語言創(chuàng)建結(jié)構(gòu)體實(shí)例對象的幾種常用方式
在Go語言中,創(chuàng)建結(jié)構(gòu)體實(shí)例的幾種方式有本質(zhì)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
簡單談?wù)凣olang中的字符串與字節(jié)數(shù)組
這篇文章主要給大家介紹了關(guān)于Golang中字符串與字節(jié)數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

