Gin 框架 -五-: 參數接收

1. 路由參數

1.1 Param

當註冊路由格式爲:/path/:a/:b 時,:x指的就是路由參數,可以直接通過Param("x")獲取值信息。

a. 代碼示例:

package main
import (
 "github.com/gin-gonic/gin" // 引入Gin框架
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 engine.GET("/test/:name", func(context *gin.Context) {
  // 接收參數
  name := context.Param("name")
  context.JSON(200, gin.H{"msg""success""name": name})
 })
 engine.GET("/test/:name/:age", func(context *gin.Context) {
  // 接收參數
  name := context.Param("name")
  age := context.Param("age")
  context.JSON(200, gin.H{
   "msg""success",
   "name": name,
   "phone":age,
  })
 })
 engine.GET("/test/:name/:age/:height", func(context *gin.Context) {
  // 接收參數
  name := context.Param("name")
  age := context.Param("age")
  height := context.Param("height")
  context.JSON(200, gin.H{
   "msg""success",
   "name": name,
   "phone":age,
   "height":height,
  })
 })
 _ = engine.Run()
}

b. 請求返回:

➜ curl -X GET http://127.0.0.1:8080/test/張三
{"msg":"success","name":"張三"}
➜ curl -X GET http://127.0.0.1:8080/test/張三/18
{"msg":"success","name":"張三","phone":"18"}
➜ curl -X GET http://127.0.0.1:8080/test/張三/18/170
{"height":"170","msg":"success","name":"張三","phone":"18"}

2.GET參數

2.1  接收單值

Gin框架中可以通過Query、DefaultQuery、GetQuery來獲取Get參數信息,而Query、DefaultQuery是對GetQuery的二次封裝。

a. 代碼示例:

package main
import (
 "github.com/gin-gonic/gin" // 引入Gin框架
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 testReceiveGetParam(engine)
 _ = engine.Run()
}
func testReceiveGetParam( engine *gin.Engine)  {
 engine.GET("/receive", func(context *gin.Context) {
  // 如果不存在或爲空,則返回:""
  name := context.Query("name")
  // 如果不存在或爲空,則返回默認值
  age := context.DefaultQuery("age","18")
  // 直接使用GetQuery
  home, ok := context.GetQuery("home")
  context.PureJSON(200,gin.H{
   "msg":"success",
   "context.Query->name":name,
   "context.DefaultQuery->age":age,
   "context.GetQuery->home":home,
   "context.GetQuery->ok":ok,
  })
 })
}

c. 請求返回:

# 不傳任何參數時,看接收情況
➜ curl -X GET http://127.0.0.1:8080/receive
{"context.DefaultQuery->age":"18","context.GetQuery->ok":false,"context.GetQuery->home":"","context.Query->name":"","msg":"success"}
# 傳任何參數時,看接收情況
➜ curl -X GET http://127.0.0.1:8080/receive\?age\=23\&home\=北京\&name\=小明
{"context.DefaultQuery->age":"23","context.GetQuery->ok":true,"context.GetQuery->home":"北京","context.Query->name":"小明","msg":"success"}

2.2 接收數組

Gin框架中可以通過QueryArray("param[]")GetQueryArray("param[]")獲取GET方式提交中的數組值信息,而QueryArray是對GetQueryArray二次封裝, 具體使用參考下面代碼:

a. 代碼示例:

//-------- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin" // 引入Gin框架
 "go-use/practise" // 代碼示例包
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestReceiveGetArrayParam(engine)
 _ = engine.Run()
}
//------ go-use/practise/param_receice.go -------
// 接收數組
func TestReceiveGetArrayParam(engine *gin.Engine)  {
 engine.GET("/getArr", func(context *gin.Context) {
  // 接收GET數組:/getArr?name[]=張三&name[]=李四
  nameList := context.QueryArray("name[]")
  context.JSON(200,gin.H{
   "arr": nameList,
  })
 })
}

b. 請求返回:

2.3 接收 Map

Gin框架中可以通過QueryMap("param")GetQueryMap("param")獲取GET方式提交中的map值信息,而QueryMap是對GetQueryMap二次封裝, 具體使用參考下面代碼:

a. 代碼示例:

//-------- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin" // 引入Gin框架
 "go-use/practise" // 代碼示例包
)

func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecGetMapParam(engine)
 _ = engine.Run()
}
//------ go-use/practise/param_receice.go -------
// 接收map
func TestRecGetMapParam(engine *gin.Engine)  {
 engine.GET("/getMap", func(context *gin.Context) {
  //接收GET map:/getMap?score[語文]=95&score[數學]=100
  queryMap := context.QueryMap("score")
  context.JSON(200,gin.H{
   "map":queryMap,
  })
 })
}

b. 請求返回:

image-20210427164158662

3.POST參數

3.1 接收單值

Gin框架中可以通過PostForm、DefaultPostForm、GetPostForm來獲取Post提交的參數信息,而PostForm、DefaultPostForm同樣是對GetPostForm的二次封裝。

a. 代碼示例:

//-------- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecPostSingleValue(engine)
 _ = engine.Run()
}
//------ go-use/practise/param_receice.go -------
// 接收單值: PostForm、DefaultPostForm、GetPostForm
func TestRecPostSingleValue(engine *gin.Engine) {
 engine.POST("/postSingle", func(context *gin.Context) {
  name := context.PostForm("name")
  age := context.DefaultQuery("age""22")
  home, ok := context.GetPostForm("home")
  context.JSON(200, gin.H{
   "postForm":         name,
   "DefaultQuery":     age,
   "GetPostForm.home": home,
   "GetPostForm.ok":   ok,
  })
 })
}

b. 請求返回:

# 不傳任何參數時,看接收情況
➜ curl -X POST http://127.0.0.1:8080/postSingle
{"DefaultQuery":"22","GetPostForm.home":"","GetPostForm.ok":false,"postForm":""}

# 傳任何參數時,看接收情況
➜  ~  curl -X POST http://127.0.0.1:8080/postSingle -d "age=40&home=南京&
{"DefaultQuery":"22","GetPostForm.home":"南京","GetPostForm.ok":true,"postForm":"張三"}

3.2 接收數組

Gin框架中可以通過PostFormArray("param[]")GetPostFormArray("param[]")獲取POST方式提交中的數組值信息,而PostFormArray是對GetPostFormArray二次封裝,具體使用參考下面代碼:

a. 代碼示例:

//-------- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecPostArrValue(engine)
 _ = engine.Run()
}
//------ go-use/practise/param_receice.go -------
// 接收POST提交的數組
func TestRecPostArrValue(engine *gin.Engine) {
 engine.POST("/postArr", func(context *gin.Context) {
  arr := context.PostFormArray("name")
  context.JSON(200, gin.H{
   "postArr": arr,
  })
 })
}

b. 請求返回:

➜ curl -X POST http://127.0.0.1:8080/postArr -d "name[]=張三&name[]=李東"
{"postArr":["張三","李東"]}

3.3 接收 Map

Gin框架中可以通過PostFormMap("param")GetPostFormMap("param")獲取POST方式提交中的映射 (map) 信息,具體使用參考下面代碼:

a. 代碼示例:

//--- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecPostMapValue(engine)
 _ = engine.Run()
}
//--- go-use/practise/param_receice.go -------
// 接收POST提交的Map信息
func TestRecPostMapValue(engine *gin.Engine)  {
 engine.POST("/postMap", func(context *gin.Context) {
  formMap := context.PostFormMap("score")
  context.JSON(200,gin.H{"map":formMap})
 })
}

b. 請求返回:

➜ curl -X POST http://127.0.0.1:8080/postMap -d "score[語文]=100&score[數學]=100"
{"map":{"數學":"100","語文":"100"}}

3.4 接收 JSON

Gin框架中可以通過BindJSON(&param)來接收提交的json格式數據, 具體使用參考下面代碼:

1. 直接賦值

a. 代碼示例:

//--- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecPostJson(engine)
 _ = engine.Run()
}
//--- go-use/practise/param_receice.go -------
// 方式一: 將接收POST提交的JSON,直接賦值給變量
func TestRecPostJson(engine *gin.Engine) {
 engine.POST("/postJson", func(context *gin.Context) {
  param := make(map[string]interface{})
  err := context.BindJSON(¶m)
  if err != nil {
   context.JSON(500, gin.H{"err": err})
      return
  }
  context.JSON(200, gin.H{"return": param})
 })
}

b. 請求返回:

# 請求
➜ curl -X POST http://127.0.0.1:8080/postJson -d '{
   "name":"張三",
   "age":20,
   "likes":["打遊戲","旅遊"]
}'
# 返回
{"return":{"age":20,"likes":["打遊戲","旅遊"],"name":"張三"}}
2. 綁定到結構體

a. 代碼示例:

//--- main.go ---------------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRecPostJson2(engine)
 _ = engine.Run()
}
//--- go-use/practise/param_receice.go -------
// 定義被綁定的結構體
type People struct {
 Name  string   `json:"name"`
 Age   int      `json:"age"`
 Likes []string `json:"likes"`
}
// 方式二: 將接收POST提交的JSON,綁定到結構體
func TestRecPostJson2(engine *gin.Engine) {
 engine.POST("/postJson2", func(context *gin.Context) {
  people := &People{}
  err := context.BindJSON(&people)
  if err != nil {
   context.JSON(500, gin.H{"err": err})
  }
  context.JSON(200, gin.H{"return": people})
 })
}

請求和返回同上。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RYe6Zn5xqMD27fHE7zU5fg