亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言Gin框架獲取請求參數(shù)的兩種方式

 更新時(shí)間:2024年01月28日 08:26:05   作者:程序員讀書  
在添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫業(yè)務(wù)處理代碼了,而編寫業(yè)務(wù)代碼第一件事一般就是獲取HTTP請求的參數(shù)吧,Gin框架在net/http包的基礎(chǔ)上封裝了獲取參數(shù)的方式,本文小編給大家介紹了獲取參數(shù)的兩種方式,需要的朋友可以參考下

引言

在添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫業(yè)務(wù)處理代碼了,而編寫業(yè)務(wù)代碼第一件事一般就是獲取HTTP請求的參數(shù)吧。

傳遞參數(shù)的方式

在一個(gè)HTTP請求中,一般可以把上傳參數(shù)分為以下三個(gè)部分:

Header

HeaderHTTP請求中一個(gè)鍵值對(duì)集合,HTTP規(guī)范定義了很多的Headeer,比如Content-TypeAccept等,不過也可以自定義請求頭部或者響應(yīng)頭部。

URL

URL指的是請求路徑,在請求路徑上可以通過兩種方式攜帶請求參數(shù),一種是直接寫在請求路徑上的,稱為URL Path

 http://localhost:8080/user/add/1

HTTP Body

HTTP Body參數(shù)是指HTTP請求的請求體所攜帶的參數(shù),這部分參數(shù)會(huì)因?yàn)?code>Content-Type不同而不同,比如當(dāng)Content-Typeapplication/json時(shí),HTTO Body攜帶的是一串JSON字符串。

那么,在Gin框架中,要如何獲取這些請求參數(shù)呢?主要有以下兩種方式:

  • 直接用Gin封裝的方法獲取請求參數(shù)
  • 通過綁定的方式來獲取請求參數(shù)

直接獲取請求參數(shù)

Gin框架在net/http包的基礎(chǔ)上封裝了獲取參數(shù)的方式。

獲取URL Path中的參數(shù)

在路由中使用通配符時(shí),對(duì)應(yīng)的通配符就會(huì)成為URL Path參數(shù),調(diào)用gin.ContextParam()方法可以獲取Path參數(shù):

 package main
 ?
 func main(){
   engine := gin.Default()
   engine.GET("/user/:id", func(ctx *gin.Context) {
     id := ctx.Param("id")
     fmt.Fprintf(ctx.Writer, "你的請求id:%s", id)
   })
     engine.Run()
 }

運(yùn)行后發(fā)起請求:

 $ curl http://localhost:8080/user/100
 你的請求id:100

獲取URL Query中的參數(shù)

gin.Context對(duì)象提供了以下幾個(gè)主要方法用于獲取Query參數(shù):

 package main
 ?
 import (
   "fmt"
 ?
   "github.com/gin-gonic/gin"
 )
 ?
 func main() {
   engine := gin.New()
   engine.GET("/user/list", func(ctx *gin.Context) {
     //獲取單個(gè)值
     name := ctx.Query("name")
     //帶默認(rèn)值
     gender := ctx.DefaultQuery("gender", "男")
     //數(shù)組
     habits := ctx.QueryArray("habits")
     //map
     works := ctx.QueryMap("works")
     fmt.Printf("%s,%s,%s,%s\n", name, gender, habits, works)
   })
 ?
   engine.Run()
 }

運(yùn)行后發(fā)起請求:

 curl --location --globoff --request GET 'http://localhost:8080/user/list?name=test&gender=%E5%A5%B3&habits=%E7%9C%8B%E4%B9%A6&habits=%E7%9C%8B%E7%94%B5%E5%BD%B1&works[%E5%86%99ppt]=1&works[%E5%86%99%E4%BB%A3%E7%A0%81]=1' \
 --header 'Content-Type: application/x-www-form-urlencoded' \
 --data-urlencode 'name=test' \
 --data-urlencode 'email=test@163.com'

獲取HTTP Body中的參數(shù)

對(duì)于通過HTTP Body傳上來的參數(shù),gin.Context也提供了幾種主要方法用于獲?。?/p>

 package main
 ?
 import (
   "fmt"
 ?
   "github.com/gin-gonic/gin"
 )
 ?
 func main() {
   engine := gin.New()
   engine.POST("/user/add", func(ctx *gin.Context) {
     //獲取單個(gè)值
     name := ctx.PostForm("name")
     //帶默認(rèn)值
     gender := ctx.DefaultPostForm("gender", "男")
     //數(shù)組
     habits := ctx.PostFormArray("habits")
     //map
     works := ctx.PostFormMap("works")
     fmt.Printf("%s,%s,%s,%s\n", name, gender, habits, works)
   })
 ?
   engine.Run()
 }

綁定請求參數(shù)

Gin支持綁定Header,URL Path,URL Query以及HTTP Body等不同位置數(shù)據(jù)。

綁定Header參數(shù)

綁定Header參數(shù)可以使用BindHeader()或者ShouldBindHeader()方法:

 package main
 ?
 import (
   "fmt"
   "net/http"
 ?
   "github.com/gin-gonic/gin"
 )
 ?
 type testHeader struct {
   Rate   int    `header:"Rate"`
   Domain string `header:"Domain"`
 }
 ?
 func main() {
   r := gin.Default()
   r.GET("/", func(c *gin.Context) {
     h := testHeader{}
 ?
     if err := c.ShouldBindHeader(&h); err != nil {
       c.JSON(http.StatusBadRequest, err)
       return
     }
 ?
     fmt.Printf("%#v\n", h)
     c.JSON(http.StatusOK, gin.H{"Rate": h.Rate, "Domain": h.Domain})
   })
 ?
   r.Run()
 }

運(yùn)行后的請求結(jié)果:

$ curl -H "rate:300" -H "domain:music" http://localhost:8080/
{"Domain":"music","Rate":300}

綁定URL Path參數(shù)

綁定URL Path參數(shù)可以使用BindUri()或者ShouldBindUri()方法:

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string `uri:"name"`
  Email string `uri:"email"`
}

func main() {
	engine := gin.New()
	engine.GET("/user/list/:id/:name", func(ctx *gin.Context) {
		var u User
		if err := ctx.BindUri(&u);err != nil {
			ctx.JSON(http.StatusBadRequest, err)
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})
	engine.Run()
}

綁定URL Query參數(shù)

綁定URL Query參數(shù)可以使用BindQuery()ShouldBindQury()、Bind()或者ShouldBind()方法:

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string `form:"name"`
  Email string `form:"email"`
}

func main() {
	engine := gin.New()
	engine.GET("/user/list", func(ctx *gin.Context) {
		var u User
		if err := ctx.BindQuery(&u);err != nil {
			ctx.JSON(http.StatusBadRequest, err)
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})

	engine.Run()
}

綁定HTTP Body參數(shù)

我們知道HTTP Body的參數(shù)會(huì)根據(jù)不同Content-Type傳不同格式的數(shù)據(jù),Gin支持以下幾種Content-Type類型的綁定:

  • JSON
  • XML
  • TOML
  • YAML
  • x-www-form-urlencoded
  • multipart/form-data

注意HTTP Body的數(shù)據(jù)只在POST請求時(shí)才會(huì)進(jìn)行綁定。

綁定HTTP Body參數(shù)可以用Bind()ShouldBind()方法,這兩個(gè)方法會(huì)根據(jù)當(dāng)前請求的Content-Type類型自動(dòng)判斷請求的類型。

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string
	Email string
}

func main() {
	engine := gin.New()
	engine.POST("/user/add", func(ctx *gin.Context) {
		var u User
		if err := ctx.Bind(&u); err != nil {
			ctx.JSON(http.StatusBadRequest, err.Error())
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})
	engine.Run()
}

如果明確請求數(shù)據(jù)的類型,也可以直接調(diào)用對(duì)應(yīng)類型綁定的方法,比如確定是JSON格式數(shù)據(jù)的話,可以調(diào)用BindJSON()或者ShouldBindJSON()

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string
	Email string
}

func main() {
	engine := gin.New()
	engine.POST("/user/add", func(ctx *gin.Context) {
		var u User
		if err := ctx.BindJSON(&u); err != nil {
			ctx.JSON(http.StatusBadRequest, err.Error())
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})
	engine.Run()
}

對(duì)于x-www-form-urlencodedmultipart/form-data,與Qurey參數(shù)一樣,結(jié)構(gòu)體需要添加formtag

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string `form:"name"`
	Email string `form:"email"`
}

func main() {
	engine := gin.New()
	engine.POST("/user/add", func(ctx *gin.Context) {
		var u User
		if err := ctx.Bind(&u); err != nil {
			ctx.JSON(http.StatusBadRequest, err.Error())
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})
	engine.Run()
}

數(shù)據(jù)校驗(yàn)

在數(shù)據(jù)綁定的時(shí)候,也可以進(jìn)行數(shù)據(jù)校驗(yàn):

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name  string `binding:"required"`
	Email string `binding:"required,email"`
}

func main() {
	engine := gin.New()
	engine.POST("/user/add", func(ctx *gin.Context) {
		var u User
		if err := ctx.Bind(&u); err != nil {
			ctx.JSON(http.StatusBadRequest, err.Error())
			return
		}
		fmt.Fprintf(ctx.Writer, "你輸入的用戶名為:%s,郵箱為:%s\n", u.Name, u.Email)
	})
	engine.Run()
}

運(yùn)行后發(fā)起請求的結(jié)果:

$ curl --location 'http://localhost:8080/user/add' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id":10,
    "name":"test",
    "email":"test@163.com"
}'

你輸入的用戶名為:test,郵箱為:test@163.com

兩種方式的對(duì)比

相較于直接獲取請求參數(shù),請求數(shù)據(jù)綁定是一種更強(qiáng)大且優(yōu)雅的參數(shù)獲取方式,使用這種方式獲取參數(shù)有以下幾個(gè)好處:

  • 直接將所有參數(shù)綁定到一個(gè)結(jié)構(gòu)體中,不需要手動(dòng)一個(gè)個(gè)地獲取參數(shù)。
  • 綁定后的參數(shù)會(huì)自動(dòng)轉(zhuǎn)換為結(jié)構(gòu)體對(duì)應(yīng)字段的類型,不需要手動(dòng)對(duì)每個(gè)參數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
  • 在進(jìn)行數(shù)據(jù)綁定的同時(shí)還可以進(jìn)行數(shù)據(jù)校驗(yàn)。

小結(jié)

直接獲取請求參數(shù)雖然沒有綁定參數(shù)那么強(qiáng)大,但對(duì)于簡單的請求來說,也是夠用的,因此,我們可以根據(jù)自己的需求,選擇對(duì)應(yīng)的方式來獲取請求參數(shù)。

以上就是Go語言Gin框架獲取請求參數(shù)的兩種方式的詳細(xì)內(nèi)容,更多關(guān)于Go Gin獲取請求參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文搞懂Golang文件操作增刪改查功能(基礎(chǔ)篇)

    一文搞懂Golang文件操作增刪改查功能(基礎(chǔ)篇)

    這篇文章主要介紹了一文搞懂Golang文件操作增刪改查功能(基礎(chǔ)篇),Golang 可以認(rèn)為是服務(wù)器開發(fā)語言發(fā)展的趨勢之一,特別是在流媒體服務(wù)器開發(fā)中,已經(jīng)占有一席之地,今天我們不聊特別深?yuàn)W的機(jī)制和內(nèi)容,就來聊一聊 Golang 對(duì)于文件的基本操作
    2021-04-04
  • Go調(diào)用C++動(dòng)態(tài)庫實(shí)現(xiàn)車牌識(shí)別的示例代碼

    Go調(diào)用C++動(dòng)態(tài)庫實(shí)現(xiàn)車牌識(shí)別的示例代碼

    本文主要介紹了如何利用C++中Opencv、TensorRT等庫編譯出動(dòng)態(tài)庫供Go調(diào)用,再寫個(gè)簡單的api對(duì)上傳的車輛圖片進(jìn)行車牌識(shí)別,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 使用Golang的channel交叉打印兩個(gè)數(shù)組的操作

    使用Golang的channel交叉打印兩個(gè)數(shù)組的操作

    這篇文章主要介紹了使用Golang的channel交叉打印兩個(gè)數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang編寫自定義IP限流中間件的方法詳解

    Golang編寫自定義IP限流中間件的方法詳解

    這篇文章給大家詳細(xì)的介紹了Golang編寫自定義IP限流中間件的方法,文章通過代碼實(shí)例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • 學(xué)習(xí)GO編程必備知識(shí)匯總

    學(xué)習(xí)GO編程必備知識(shí)匯總

    這篇文章主要介紹了學(xué)習(xí)GO編程必備知識(shí)匯總的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Go語言接口用法實(shí)例

    Go語言接口用法實(shí)例

    這篇文章主要介紹了Go語言接口用法,實(shí)例分析了Go語言接口的功能、定義及使用技巧,需要的朋友可以參考下
    2015-02-02
  • golang中的io.ReadCloser與ioutil.NopCloser使用

    golang中的io.ReadCloser與ioutil.NopCloser使用

    這篇文章主要介紹了golang中的io.ReadCloser與ioutil.NopCloser使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Go語言實(shí)現(xiàn)對(duì)XML的讀取和修改

    Go語言實(shí)現(xiàn)對(duì)XML的讀取和修改

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)對(duì)XML的讀取和修改的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Go遞歸修改文件名的實(shí)例代碼

    Go遞歸修改文件名的實(shí)例代碼

    這篇文章主要介紹了Go遞歸修改文件名的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的餓參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過程解析示例

    Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過程解析示例

    這篇文章主要為大家介紹了Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過程解析示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論