欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年10月28日 15:19:10   作者:陳宏博  
這篇文章主要介紹了Gin golang web開發(fā)模型綁定實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

gin中的模型綁定可以理解為:把請求的參數(shù)映射為一個(gè)具體的類型。gin支持JSON,XML,YAML和表單參數(shù)等多種參數(shù)格式,只需要在對應(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會為我們綁定查詢字符串中的name和address兩個(gè)參數(shù)。注意雖然我們聲明了form標(biāo)簽,ShouldBindQuery只綁定查詢字符串中的參數(shù)。

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

其他類型參數(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[]"`
}

文件上傳這種場景我很少用模型綁定的方式獲取參數(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")
}

多種類型的模型綁定

如果我們有一個(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ī)號
}

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ù)來源,當(dāng)前gin版本為1.6.x,不知道未來會不會提供這種功能。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析Go語言中Channel的各種用法

    淺析Go語言中Channel的各種用法

    這篇文章主要帶大家一起來學(xué)習(xí)一下Go語言中的if語句,也就是大家口中的判斷語句。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-11-11
  • 使用Go語言寫一個(gè)Http?Server的實(shí)現(xiàn)

    使用Go語言寫一個(gè)Http?Server的實(shí)現(xiàn)

    本文主要介紹了使用Go語言寫一個(gè)Http?Server的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • golang?開啟opencv圖形化編程

    golang?開啟opencv圖形化編程

    這篇文章主要為大家介紹了golang?開啟opencv圖形化編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go語言學(xué)習(xí)之運(yùn)算符使用詳解

    Go語言學(xué)習(xí)之運(yùn)算符使用詳解

    這篇文章主要介紹了Go語言中常用運(yùn)算符的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Golang中的占位符詳解

    Golang中的占位符詳解

    這篇文章主要給大家詳細(xì)總結(jié)了Golang中的占位符用法,文章通過代碼示例介紹的非常詳細(xì),對我們學(xué)習(xí)Golang占位符有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • Go語言運(yùn)行環(huán)境安裝詳細(xì)教程

    Go語言運(yùn)行環(huán)境安裝詳細(xì)教程

    這篇文章主要介紹了Go語言運(yùn)行環(huán)境安裝詳細(xì)教程,本文講解了Linux、MAC OS、Windows下的安裝方法,同時(shí)講解了驗(yàn)證是否安裝成功、第三方工具安裝運(yùn)行環(huán)境的方法,需要的朋友可以參考下
    2014-10-10
  • golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn)

    golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn)

    這篇文章主要介紹了golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go習(xí)慣用法(多值賦值短變量聲明賦值簡寫模式)基礎(chǔ)實(shí)例

    Go習(xí)慣用法(多值賦值短變量聲明賦值簡寫模式)基礎(chǔ)實(shí)例

    本文為大家介紹了Go習(xí)慣用法(多值賦值,短變量聲明和賦值,簡寫模式、多值返回函數(shù)、comma,ok 表達(dá)式、傳值規(guī)則)的基礎(chǔ)實(shí)例,幫大家鞏固扎實(shí)Go語言基礎(chǔ)
    2024-01-01
  • golang日志框架之logrus的安裝使用教程

    golang日志框架之logrus的安裝使用教程

    logrus是一個(gè)非常強(qiáng)大的日志框架,具有靈活的功能和易于使用的API,適合處理各種類型的日志需求,這篇文章主要介紹了golang日志框架之logrus的安裝使用,需要的朋友可以參考下
    2023-08-08
  • Go語言實(shí)現(xiàn)新春祝福二維碼的生成

    Go語言實(shí)現(xiàn)新春祝福二維碼的生成

    二維碼現(xiàn)在是隨處度可以看到,買東西,支付,添加好友只要你掃一掃就能完成整個(gè)工作,簡單且方便。所以利用這個(gè)新春佳節(jié)做一個(gè)帶著新春祝福的二維碼吧
    2023-02-02

最新評論