您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Gin golang web開發(fā)模型綁定,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
gin中的模型綁定可以理解為:把請求的參數(shù)映射為一個具體的類型。gin支持JSON,XML,YAML和表單參數(shù)等多種參數(shù)格式,只需要在對應的字段上聲明標簽。
綁定表單或者查詢字符串
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標簽,并調(diào)用ShouldBindQuery方法,gin會為我們綁定查詢字符串中的name和address兩個參數(shù)。注意雖然我們聲明了form標簽,ShouldBindQuery只綁定查詢字符串中的參數(shù)。
如果你想綁定表單中的參數(shù)的話結(jié)構(gòu)體不用改變,需要把ShouldBindQuery方更改為ShouldBind方法。ShouldBind方法會區(qū)分GET和POST請求,如果是GET請求綁定查詢字符串中的參數(shù),如果是POST請求綁定表單參數(shù)中的內(nèi)容,但是不能同時綁定兩種參數(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前端頁面交互的時候,似乎已經(jīng)成為了一種事實標準。gin綁定json格式數(shù)據(jù)方法很簡單,只需要設置字段的標簽為json并且調(diào)用ShouldBind方法。
其他類型參數(shù)綁定
路由參數(shù)在綁定時設置標簽為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ù),字段的標簽設置為header,調(diào)用方法為ShouldBindHeader。
還有不太常用的數(shù)組參數(shù)是字段標簽設置為form:"colors[]",結(jié)構(gòu)體例子如下:
type myForm struct { Colors []string `form:"colors[]"` }
文件上傳這種場景我很少用模型綁定的方式獲取參數(shù),在gin中對于這種場景也提供了模型綁定支持。
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") }
多種類型的模型綁定
如果我們有一個UpdateUser接口,PUT /user/:id,參數(shù)是{"nickname": "nickname...","mobile": "13322323232"}。代碼如下:
type ProfileForm struct { Id int `uri:"id"` Nickname string `json:"nickname"` // 昵稱 Mobile string `json:"mobile"` // 手機號 } 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)用一個方法同時綁定多個參數(shù)來源,當前gin版本為1.6.x,不知道未來會不會提供這種功能。
看完上述內(nèi)容,你們對Gin golang web開發(fā)模型綁定有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。