91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Gin golang web開發模型綁定

發布時間:2020-10-29 14:48:20 來源:億速云 閱讀:217 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關Gin golang web開發模型綁定,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

gin中的模型綁定可以理解為:把請求的參數映射為一個具體的類型。gin支持JSON,XML,YAML和表單參數等多種參數格式,只需要在對應的字段上聲明標簽。

綁定表單或者查詢字符串

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兩個參數。注意雖然我們聲明了form標簽,ShouldBindQuery只綁定查詢字符串中的參數。

如果你想綁定表單中的參數的話結構體不用改變,需要把ShouldBindQuery方更改為ShouldBind方法。ShouldBind方法會區分GET和POST請求,如果是GET請求綁定查詢字符串中的參數,如果是POST請求綁定表單參數中的內容,但是不能同時綁定兩種參數。

綁定json參數

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是一種常用的數據交換格式,尤其是在和web前端頁面交互的時候,似乎已經成為了一種事實標準。gin綁定json格式數據方法很簡單,只需要設置字段的標簽為json并且調用ShouldBind方法。

其他類型參數綁定

路由參數在綁定時設置標簽為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中的參數,字段的標簽設置為header,調用方法為ShouldBindHeader。

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

type myForm struct {
  Colors []string `form:"colors[]"`
}

文件上傳這種場景我很少用模型綁定的方式獲取參數,在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,參數是{"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方法才獲取到全部的參數。和gin社區溝通之后發現目前還不能調用一個方法同時綁定多個參數來源,當前gin版本為1.6.x,不知道未來會不會提供這種功能。

看完上述內容,你們對Gin golang web開發模型綁定有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇宁| 绥滨县| 汉川市| 贵州省| 中宁县| 桂林市| 泸水县| 日土县| 绥滨县| 乃东县| 当涂县| 眉山市| 砚山县| 闻喜县| 杨浦区| 佛教| 海宁市| 大关县| 称多县| 台州市| 县级市| 驻马店市| 武宣县| 德令哈市| 陆良县| 九寨沟县| 泸水县| 屏山县| 修文县| 新田县| 吉安市| 伊金霍洛旗| 苏尼特右旗| 嵊泗县| 桑日县| 西丰县| 沾益县| 石家庄市| 泸州市| 红桥区| 通许县|