go框架(3)-gin请求参数

请求参数

1. Get请求参数

使用Get请求传参时,类似于这样 http://localhost:8080/user/save?id=11&name=zhangsan

如何获取呢?

1.1 普通参数

request url: http://localhost:8080/user/save?id=11&name=zhangsan

r.GET("/user/save", func(ctx *gin.Context) {
  id := ctx.Query("id")
  name := ctx.Query("name")
  ctx.JSON(200, gin.H{
   "id":   id,
   "name": name,
  })
 })

如果参数不存在,就给一个默认值:

r.GET("/user/save", func(ctx *gin.Context) {
  id := ctx.Query("id")
  name := ctx.Query("name")
  address := ctx.DefaultQuery("address", "北京")
  ctx.JSON(200, gin.H{
   "id":      id,
   "name":    name,
   "address": address,
  })
 })

判断参数是否存在:

r.GET("/user/save", func(ctx *gin.Context) {
  id, ok := ctx.GetQuery("id")
  address, aok := ctx.GetQuery("address")
  ctx.JSON(200, gin.H{
   "id":      id,
   "idok":    ok,
   "address": address,
   "aok":     aok,
  })
 })

id是数值类型,上述获取的都是string类型,根据类型获取:

type User struct {
 Id   int64  `form:"id"`
 Name string `form:"name"`
}
r.GET("/user/save", func(ctx *gin.Context) {
  var user User
  err := ctx.BindQuery(&user)
  if err != nil {
   log.Println(err)
  }
  ctx.JSON(200, user)
})

也可以:

r.GET("/user/save", func(ctx *gin.Context) {
  var user User
  err := ctx.ShouldBindQuery(&user)
  if err != nil {
   log.Println(err)
  }
  ctx.JSON(200, user)
 })

区别:

type User struct {
 Id      int64  `form:"id"`
 Name    string `form:"name"`
 Address string `form:"address" binding:"required"`
}

当bind是必须的时候,ShouldBindQuery会报错,开发者自行处理,状态码不变。

BindQuery则报错的同时,会将状态码改为400。所以一般建议是使用Should开头的bind。

1.2 数组参数

请求url:http://localhost:8080/user/save?address=Beijing&address=shanghai

r.GET("/user/save", func(ctx *gin.Context) {
  address := ctx.QueryArray("address")
  ctx.JSON(200, address)
 })
r.GET("/user/save", func(ctx *gin.Context) {
  address, ok := ctx.GetQueryArray("address")
  fmt.Println(ok)
  ctx.JSON(200, address)
 })
r.GET("/user/save", func(ctx *gin.Context) {
  var user User
  err := ctx.ShouldBindQuery(&user)
  fmt.Println(err)
  ctx.JSON(200, user)
 })

1.3 map参数

请求url:http://localhost:8080/user/save?addressMap[home]=Beijing&addressMap[company]=shanghai

r.GET("/user/save", func(ctx *gin.Context) {
  addressMap := ctx.QueryMap("addressMap")
  ctx.JSON(200, addressMap)
 })
r.GET("/user/save", func(ctx *gin.Context) {
  addressMap, _ := ctx.GetQueryMap("addressMap")
  ctx.JSON(200, addressMap)
 })

map参数 bind并没有支持

2. Post请求参数

post请求一般是表单参数和json参数

2.1 表单参数

r.POST("/user/save", func(ctx *gin.Context) {
  id := ctx.PostForm("id")
  name := ctx.PostForm("name")
  address := ctx.PostFormArray("address")
  addressMap := ctx.PostFormMap("addressMap")
  ctx.JSON(200, gin.H{
   "id":         id,
   "name":       name,
   "address":    address,
   "addressMap": addressMap,
  })
 })
r.POST("/user/save", func(ctx *gin.Context) {
  var user User
  err := ctx.ShouldBind(&user)
  addressMap, _ := ctx.GetPostFormMap("addressMap")
  user.AddressMap = addressMap
  fmt.Println(err)
  ctx.JSON(200, user)
 })

2.2 json参数

{
    "id":1111,
    "name":"zhangsan",
    "address": [
        "beijing",
        "shanghai"
    ],
    "addressMap":{
        "home":"beijing"
    }
}
r.POST("/user/save", func(ctx *gin.Context) {
  var user User
  err := ctx.ShouldBindJSON(&user)
  fmt.Println(err)
  ctx.JSON(200, user)
 })

其他类型参数注入xml,yaml等和json道理一样

3. 路径参数

请求url:http://localhost:8080/user/save/111

r.POST("/user/save/:id", func(ctx *gin.Context) {
  ctx.JSON(200, ctx.Param("id"))
 })

4. 文件参数

r.POST("/user/save", func(ctx *gin.Context) {
  form, err := ctx.MultipartForm()
  if err != nil {
   log.Println(err)
  }
  files := form.File
  for _, fileArray := range files {
   for _, v := range fileArray {
    ctx.SaveUploadedFile(v, "./"+v.Filename)
   }

  }
  ctx.JSON(200, form.Value)
 })


go框架(3)-gin请求参数
http://47.123.5.226:8090//archives/gokuang-jia-3--ginqing-qiu-can-shu
作者
pony
发布于
2024年05月09日
许可协议