Gin golang web開(kāi)發(fā)模型綁定實(shí)現(xiàn)過(guò)程解析
我們了解到gin可用通過(guò)類(lèi)似DefaultQuery或DefaultPostForm等方法獲取到前端提交過(guò)來(lái)的參數(shù)。參數(shù)不多的情況下也很好用,但是想想看,如果接口有很多個(gè)參數(shù)的時(shí)候再用這種方法就要調(diào)用很多次獲取參數(shù)的方法,本文將介紹一種新的接收參數(shù)的方法來(lái)解決這個(gè)問(wèn)題:模型綁定。
gin中的模型綁定可以理解為:把請(qǐng)求的參數(shù)映射為一個(gè)具體的類(lèi)型。gin支持JSON,XML,YAML和表單參數(shù)等多種參數(shù)格式,只需要在對(duì)應(yīng)的字段上聲明標(biāo)簽。
綁定表單或者查詢字符串
type Person struct {
Name string `form:"name"`
Address string `form:"address"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBindQuery(&person) == nil {
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
在結(jié)構(gòu)體Name字段聲明form標(biāo)簽,并調(diào)用ShouldBindQuery方法,gin會(huì)為我們綁定查詢字符串中的name和address兩個(gè)參數(shù)。注意雖然我們聲明了form標(biāo)簽,ShouldBindQuery只綁定查詢字符串中的參數(shù)。
如果你想綁定表單中的參數(shù)的話結(jié)構(gòu)體不用改變,需要把ShouldBindQuery方更改為ShouldBind方法。ShouldBind方法會(huì)區(qū)分GET和POST請(qǐng)求,如果是GET請(qǐng)求綁定查詢字符串中的參數(shù),如果是POST請(qǐng)求綁定表單參數(shù)中的內(nèi)容,但是不能同時(shí)綁定兩種參數(shù)。
綁定json參數(shù)
type Person struct {
Name string `json:"name"`
Address string `json:"address"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBind(&person) == nil {
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
json是一種常用的數(shù)據(jù)交換格式,尤其是在和web前端頁(yè)面交互的時(shí)候,似乎已經(jīng)成為了一種事實(shí)標(biāo)準(zhǔn)。gin綁定json格式數(shù)據(jù)方法很簡(jiǎn)單,只需要設(shè)置字段的標(biāo)簽為json并且調(diào)用ShouldBind方法。
其他類(lèi)型參數(shù)綁定
路由參數(shù)在綁定時(shí)設(shè)置標(biāo)簽為uri,并調(diào)用ShouldBindUri方法。
type Person struct {
Id string `uri:"id"`
}
func startPage(c *gin.Context) {
var person Person
if c.ShouldBindUri(&person) == nil {
log.Println(person.Id)
}
c.String(200, "Success")
}
綁定在HTTP Header中的參數(shù),字段的標(biāo)簽設(shè)置為header,調(diào)用方法為ShouldBindHeader。
還有不太常用的數(shù)組參數(shù)是字段標(biāo)簽設(shè)置為form:"colors[]",結(jié)構(gòu)體例子如下:
type myForm struct {
Colors []string `form:"colors[]"`
}
文件上傳這種場(chǎng)景我很少用模型綁定的方式獲取參數(shù),在gin中對(duì)于這種場(chǎng)景也提供了模型綁定支持。
type ProfileForm struct {
Name string `form:"name"`
Avatar *multipart.FileHeader `form:"avatar"`
// Avatars []*multipart.FileHeader `form:"avatar"` 多文件上傳
}
func main() {
router := gin.Default()
router.POST("/profile", func(c *gin.Context) {
var form ProfileForm
if err := c.ShouldBind(&form); err != nil {
c.String(http.StatusBadRequest, "bad request")
return
}
err := c.SaveUploadedFile(form.Avatar, form.Avatar.Filename)
if err != nil {
c.String(http.StatusInternalServerError, "unknown error")
return
}
c.String(http.StatusOK, "ok")
})
router.Run(":8080")
}
多種類(lèi)型的模型綁定
如果我們有一個(gè)UpdateUser接口,PUT /user/:id,參數(shù)是{"nickname": "nickname...","mobile": "13322323232"}。代碼如下:
type ProfileForm struct {
Id int `uri:"id"`
Nickname string `json:"nickname"` // 昵稱
Mobile string `json:"mobile"` // 手機(jī)號(hào)
}
func main() {
router := gin.Default()
router.GET("/user/:id", func(c *gin.Context) {
var form ProfileForm
if err := c.ShouldBindUri(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := c.ShouldBindJSON(&form); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.String(http.StatusOK, "ok")
})
router.Run(":8080")
}
代碼里調(diào)用了兩次bind方法才獲取到全部的參數(shù)。和gin社區(qū)溝通之后發(fā)現(xiàn)目前還不能調(diào)用一個(gè)方法同時(shí)綁定多個(gè)參數(shù)來(lái)源,當(dāng)前gin版本為1.6.x,不知道未來(lái)會(huì)不會(huì)提供這種功能。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Go語(yǔ)言的Windows下環(huán)境配置以及簡(jiǎn)單的程序結(jié)構(gòu)講解
這篇文章主要介紹了Go語(yǔ)言的Windows下環(huán)境配置以及簡(jiǎn)單的程序結(jié)構(gòu)講解,從編程語(yǔ)言約定俗成的hellow world開(kāi)始,需要的朋友可以參考下2015-10-10
Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例
在日常開(kāi)發(fā)中,我們通常需要針對(duì)現(xiàn)有的功能進(jìn)行單元測(cè)試,以驗(yàn)證開(kāi)發(fā)的正確性,本文主要介紹了Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Go中g(shù)in框架的*gin.Context參數(shù)常見(jiàn)實(shí)用方法
*gin.Context是處理HTTP請(qǐng)求的核心,ctx代表"context"(上下文),它包含了處理請(qǐng)求所需的所有信息和方法,例如請(qǐng)求數(shù)據(jù)、響應(yīng)構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見(jiàn)實(shí)用方法,需要的朋友可以參考下2024-07-07
基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能
最近項(xiàng)目開(kāi)發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時(shí)需要特定的格式,所以本文給大家介紹了基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Golang實(shí)現(xiàn)深拷貝reflect原理示例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go語(yǔ)言實(shí)現(xiàn)布谷鳥(niǎo)過(guò)濾器的方法
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)布谷鳥(niǎo)過(guò)濾器的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
使用GO語(yǔ)言實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)CURD的簡(jiǎn)單示例
本文主要介紹了使用GO語(yǔ)言實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)CURD的簡(jiǎn)單示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Go語(yǔ)言中init函數(shù)與匿名函數(shù)使用淺析
這篇文章主要介紹了Go語(yǔ)言中init函數(shù)與匿名函數(shù)使用淺析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01

