Golang 關(guān)于Gin框架請(qǐng)求參數(shù)的獲取方法
Gin框架請(qǐng)求參數(shù)的獲取
Gin是一個(gè)用Go語(yǔ)言編寫(xiě)的Web框架,它提供了強(qiáng)大的路由和中間件功能,使得開(kāi)發(fā)Web應(yīng)用變得更加簡(jiǎn)單和高效。
在使用Gin框架開(kāi)發(fā)Web應(yīng)用時(shí),處理請(qǐng)求參數(shù)是一個(gè)非常重要的環(huán)節(jié)。本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Go語(yǔ)言中如何使用Gin框架處理請(qǐng)求參數(shù)。
一、請(qǐng)求參數(shù)的類型和位置
在HTTP請(qǐng)求中,參數(shù)可以通過(guò)多種方式傳遞,常見(jiàn)的類型包括:
URL Path參數(shù):參數(shù)直接寫(xiě)在請(qǐng)求路徑中,例如/user/:id。
URL Query參數(shù):參數(shù)跟在URL的?后面,以鍵值對(duì)的形式傳遞,多個(gè)參數(shù)之間用&分隔,例如/user/list?name=John&gender=男。
HTTP Body參數(shù):參數(shù)在請(qǐng)求體中傳遞,通常用于POST、PUT等請(qǐng)求方法,內(nèi)容格式可以是JSON、XML等。
Header參數(shù):參數(shù)在HTTP請(qǐng)求頭中傳遞,例如Content-Type、Accept等。
二、獲取請(qǐng)求參數(shù)的方法
Gin框架提供了多種方法來(lái)獲取請(qǐng)求參數(shù),包括直接獲取和綁定到結(jié)構(gòu)體中兩種方式。
1. 直接獲取請(qǐng)求參數(shù)
(1)獲取URL Path參數(shù)
URL Path參數(shù)是指直接寫(xiě)在請(qǐng)求路徑中的參數(shù),可以通過(guò)Gin框架的Param方法獲取。
后臺(tái)獲取路徑請(qǐng)求參數(shù)通過(guò)ctx.Param(“參數(shù)名”) 來(lái)獲取
示例代碼:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { engine := gin.Default() //請(qǐng)求參數(shù) 用:變量名 表示 engine.GET("/user/:id", func(ctx *gin.Context) { //后臺(tái)獲取請(qǐng)求參數(shù)通過(guò)ctx.Param("參數(shù)名") 來(lái)獲取 id := ctx.Param("id") //響應(yīng)到頁(yè)面 //fmt.Fprintf(ctx.Writer, "你的請(qǐng)求id: %s", id) ctx.String(http.StatusOK, "您的id是%s", id) }) engine.Run() }
運(yùn)行后,發(fā)起請(qǐng)求http://localhost:8080/user/100,會(huì)返回你的請(qǐng)求id: 100。
(2)獲取URL Query參數(shù)
URL Query參數(shù)是指跟在URL的?后面的鍵值對(duì)集合,可以通過(guò)Gin框架的Query、DefaultQuery、QueryArray、QueryMap等方法獲取。
示例代碼:
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func main() { engine := gin.Default() engine.GET("/user/list", func(ctx *gin.Context) { name := ctx.Query("name") gender := ctx.DefaultQuery("gender", "男") habits := ctx.QueryArray("habits") fmt.Printf("name: %s, gender: %s, habits: %v\n", name, gender, habits) works := ctx.QueryMap("works") //響應(yīng)到頁(yè)面 ctx.String(http.StatusOK, "%s, %s, %v, %s\n", name, gender, habits, works) }) engine.Run(":8080") }
運(yùn)行后,瀏覽器發(fā)起請(qǐng)求
http://127.0.0.1:8080/user/list?name=John&gender=男&habits=reading&habits=sports&works[teacher]=math&works[engineer]=computer
會(huì)返回 John, 男, [reading sports], map[engineer:computer teacher:math]
(3)獲取HTTP Body參數(shù)
HTTP Body參數(shù)是指請(qǐng)求體中的參數(shù),通常用于POST、PUT等請(qǐng)求方法。可以通過(guò)Gin框架的PostForm、DefaultPostForm、PostFormArray、PostFormMap等方法獲取。
示例代碼:
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { engine := gin.Default() //使用post請(qǐng)求 engine.POST("/user/add", func(ctx *gin.Context) { name := ctx.PostForm("name") gender := ctx.DefaultPostForm("gender", "男") //獲取切片數(shù)據(jù) habits := ctx.PostFormArray("habits") //獲取map數(shù)據(jù) works := ctx.PostFormMap("works") fmt.Printf("%s, %s, %v, %s\n", name, gender, habits, works) }) engine.Run() }
postman發(fā)請(qǐng)求
(4)獲取Header參數(shù)
Header參數(shù)是指HTTP請(qǐng)求頭中的參數(shù),可以通過(guò)Gin框架的GetHeader方法獲取。
示例代碼:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { engine := gin.Default() engine.POST("/getHeader", func(ctx *gin.Context) { //拿到請(qǐng)求頭參數(shù)數(shù)據(jù) userAgent := ctx.GetHeader("User-Agent") ctx.String(http.StatusOK, "User-Agent: %s", userAgent) }) engine.Run() }
2. 綁定請(qǐng)求參數(shù)到結(jié)構(gòu)體
Gin框架支持將請(qǐng)求參數(shù)自動(dòng)綁定到結(jié)構(gòu)體中,這樣可以更方便地進(jìn)行參數(shù)驗(yàn)證和處理。綁定參數(shù)的方法包括Bind、ShouldBind、BindJSON、BindQuery等。
(1)綁定URL Query參數(shù)到結(jié)構(gòu)體
示例代碼:
package main import ( "github.com/gin-gonic/gin" "net/http" ) // User 定義結(jié)構(gòu)體,使用form標(biāo)簽指定參數(shù)名,以便正確地綁定參數(shù) get請(qǐng)求使用功能form標(biāo)簽 type User struct { Id int64 `form:"id"` Name string `form:"name"` Age int `form:"age"` Email string `form:"email"` } func main() { engine := gin.Default() engine.GET("/user/info", func(ctx *gin.Context) { var user User //將結(jié)構(gòu)體對(duì)象指針傳進(jìn)去 if err := ctx.ShouldBindQuery(&user); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } //以json字符串的方式響應(yīng)給客戶端這個(gè)結(jié)構(gòu)體對(duì)象 ctx.JSON(http.StatusOK, user) }) engine.Run() }
(2)綁定HTTP Body參數(shù)到結(jié)構(gòu)體(JSON格式)
當(dāng)前端請(qǐng)求的數(shù)據(jù)通過(guò)JSON提交時(shí),例如向/json
發(fā)送一個(gè)POST請(qǐng)求
示例代碼:
package main import ( "github.com/gin-gonic/gin" "net/http" ) // User 綁定HTTP Body參數(shù)到結(jié)構(gòu)體 ,創(chuàng)建結(jié)構(gòu)體時(shí)需要用json標(biāo)簽 type User struct { Id int64 `json:"id"` Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` } func main() { engine := gin.Default() engine.POST("/user/add", func(ctx *gin.Context) { var user User // ctx.ShouldBindJSON(&user) 將結(jié)構(gòu)體指針傳進(jìn)去 if err := ctx.ShouldBindJSON(&user); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } //響應(yīng)給客戶端結(jié)構(gòu)體 ctx.JSON(http.StatusOK, user) }) engine.Run() }
也可以直接獲取原生json數(shù)據(jù)處理
package main import ( "encoding/json" "github.com/gin-gonic/gin" "net/http" ) func main() { engine := gin.Default() engine.POST("/json", func(ctx *gin.Context) { // GetRawData : 從c.Request.Body讀取請(qǐng)求數(shù)據(jù), 返回 []byte // func (c *Context) GetRawData() ([]byte, error) b, _ := ctx.GetRawData() // 定義map或結(jié)構(gòu)體接收 var m map[string]interface{} // 將接收的b json反序列化為map數(shù)據(jù) _ = json.Unmarshal(b, &m) ctx.JSON(http.StatusOK, m) }) engine.Run() }
到此這篇關(guān)于Golang 關(guān)于Gin框架請(qǐng)求參數(shù)的獲取的文章就介紹到這了,更多相關(guān)Golang Gin框架請(qǐng)求參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文教你如何用好GO語(yǔ)言變長(zhǎng)參數(shù)
對(duì)于函數(shù)重載相信編碼過(guò)的?xdm?肯定不會(huì)陌生,那么我們一起分別來(lái)看看?C?語(yǔ)言,C++?語(yǔ)言,GO?語(yǔ)言?如何去模擬和使用重載,感興趣的可以學(xué)習(xí)一下2023-09-09Go語(yǔ)言并發(fā)之Sync包的6個(gè)關(guān)鍵概念總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言并發(fā)中Sync包的6個(gè)關(guān)鍵概念,文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2023-05-05golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)
這篇文章主要介紹了golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例
本文主要介紹了go語(yǔ)言實(shí)現(xiàn)同步操作項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05