佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Gin golang web開發(fā)模型綁定實現(xiàn)過程解析

Gin golang web開發(fā)模型綁定實現(xiàn)過程解析

熱門標簽:服務外包 網(wǎng)站排名優(yōu)化 百度競價排名 鐵路電話系統(tǒng) AI電銷 Linux服務器 地方門戶網(wǎng)站 呼叫中心市場需求

我們了解到gin可用通過類似DefaultQuery或DefaultPostForm等方法獲取到前端提交過來的參數(shù)。參數(shù)不多的情況下也很好用,但是想想看,如果接口有很多個參數(shù)的時候再用這種方法就要調用很多次獲取參數(shù)的方法,本文將介紹一種新的接收參數(shù)的方法來解決這個問題:模型綁定。

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")
}

在結構體Name字段聲明form標簽,并調用ShouldBindQuery方法,gin會為我們綁定查詢字符串中的name和address兩個參數(shù)。注意雖然我們聲明了form標簽,ShouldBindQuery只綁定查詢字符串中的參數(shù)。

如果你想綁定表單中的參數(shù)的話結構體不用改變,需要把ShouldBindQuery方更改為ShouldBind方法。ShouldBind方法會區(qū)分GET和POST請求,如果是GET請求綁定查詢字符串中的參數(shù),如果是POST請求綁定表單參數(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前端頁面交互的時候,似乎已經成為了一種事實標準。gin綁定json格式數(shù)據(jù)方法很簡單,只需要設置字段的標簽為json并且調用ShouldBind方法。

其他類型參數(shù)綁定

路由參數(shù)在綁定時設置標簽為uri,并調用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,調用方法為ShouldBindHeader。

還有不太常用的數(shù)組參數(shù)是字段標簽設置為form:"colors[]",結構體例子如下:

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")
}

代碼里調用了兩次bind方法才獲取到全部的參數(shù)。和gin社區(qū)溝通之后發(fā)現(xiàn)目前還不能調用一個方法同時綁定多個參數(shù)來源,當前gin版本為1.6.x,不知道未來會不會提供這種功能。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • nodejs個人博客開發(fā)第四步 數(shù)據(jù)模型
  • 詳解iOS應用UI開發(fā)中的九宮格坐標計算與字典轉換模型
  • iOS中的應用啟動原理以及嵌套模型開發(fā)示例詳解
  • PHP YII框架開發(fā)小技巧之模型(models)中rules自定義驗證規(guī)則
  • 軟件開發(fā)七大過程模型

標簽:仙桃 湖南 崇左 衡水 湘潭 黃山 蘭州 銅川

巨人網(wǎng)絡通訊聲明:本文標題《Gin golang web開發(fā)模型綁定實現(xiàn)過程解析》,本文關鍵詞  ;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    来安县| 文安县| 达孜县| 合水县| 南昌市| 张家港市| 沁水县| 突泉县| 阳朔县| 鄄城县| 谢通门县| 资兴市| 昌江| 北碚区| 萨嘎县| 绥芬河市| 炎陵县| 八宿县| 若尔盖县| 米泉市| 横峰县| 朝阳区| 石柱| 台北市| 香港 | 闸北区| 山东省| 盘山县| 浮山县| 西藏| 汤阴县| 巴林右旗| 神农架林区| 黄石市| 朝阳县| 环江| 武宁县| 慈利县| 什邡市| 南江县| 兴仁县|