Skip to content
On this page

请求参数

GET请求

普通参数

  • ctx.Query:获取参数

  • ctx.DefaultQuery:可设置参数默认值

  • ctx.GetQuery:可验证参数是否传递

Go
func (*gin.Context).Query(key string) (value string)

func (*gin.Context).DefaultQuery(key string, defaultValue string) string

func (*gin.Context).GetQuery(key string) (string, bool)

代码示例

Go
func queryHanlder(ctx *gin.Context) {
	user_name := ctx.Query("userName")
	age := ctx.Query("age")
	// 可以设置默认值
	like := ctx.DefaultQuery("like", "篮球")
	// 判断参数是否存在
	password, isPasswordExist := ctx.GetQuery("password")
	// ctx.Query 张三 88
	// fmt.Println("ctx.Query", user_name, age)
	fmt.Println("ctx.Query", user_name, age, like)
	ctx.JSON(http.StatusOK, gin.H{
		"user_name": user_name,
		"age": age,
		"like": like,
		"password": password,
		"isPasswordExist": isPasswordExist,
	})
}

访问 /get_query?userName=张三&age=22

json
{
    "age": "22",
    "isPasswordExist": false,
    "like": "篮球",
    "password": "",
    "user_name": "张三"
}

关于bindxxx绑定器,点击这里

  • ctx.BindQuery:绑定并为结构体赋值,当bind为必须时,如果客户端未传值,会报400

  • ctx.ShouldBindQuery::绑定并为结构体赋值,当bind为必须时,如果客户端未传值,会使用类型默认值

  • 可以使用form:"xxx"这个tag来设置客户端传的key

  • 使用binding:"required"设置字段必填

Go
func (*gin.Context).BindQuery(obj any) error

func (*gin.Context).ShouldBindQuery(obj any) error

代码示例

Go
type User struct {
	UserName string `form:"user_name" json:"user_name"`
	Age int `form:"age" json:"age"`
	Address string `form:"address" json:"address" binding:"required"`
}

func queryBindHanlder(ctx *gin.Context) {
	var user User
	// err := ctx.BindQuery(&user)
	err := ctx.ShouldBindQuery(&user)
	if err != nil {
		fmt.Println("bindQuery Error", err)
	}
	ctx.JSON(http.StatusOK, user)
}

访问/get_bind_query?user_name=张三

json
{
    "user_name": "张三",
    "age": 0,
    "address": ""
}

数组参数

  • ctx.QueryArray:获取key相同的多个参数

  • ctx.QueryArray:获取key相同的多个参数,可检测是否传值

Go
func (*gin.Context).QueryArray(key string) (values []string)

func (*gin.Context).GetQueryArray(key string) (values []string, ok bool)

代码示例

Go
func multiQueryHanlder(ctx *gin.Context) {
	// usernames := ctx.QueryArray("userName")
	values, ok := ctx.GetQueryArray("userName")
	// ctx.JSON(http.StatusOK, usernames)
	ctx.JSON(http.StatusOK, gin.H{ "usernames": values, "ok": ok })
}

访问/get_multi_query?userName=zhang&userName=li&userName=wang

json
{
    "ok": true,
    "usernames": [
        "zhang",
        "li",
        "wang"
    ]
}

map参数

  • ctx.QueryMap:获取map参数
  • ctx.GetQueryMap:获取map参数,可检测是否传值

代码示例

Go
func mapQueryHanlder(ctx *gin.Context) {
	infoMap := ctx.QueryMap("info")
	infoMap, isInfoMapExist := ctx.GetQueryMap("info")
	// ctx.JSON(http.StatusOK, infoMap)
	ctx.JSON(http.StatusOK, gin.H{ "infoMap": infoMap, "isInfoMapExist": isInfoMapExist })
}

访问/get_map_query

json
{
    "infoMap": {},
    "isInfoMapExist": false
}

访问/get_map_query?info[name]=zhang&info[age]=22

json
{
    "infoMap": {
        "age": "22",
        "name": "zhang"
    },
    "isInfoMapExist": true
}

POST请求

form表单参数

  • ctx.PostForm:获取from单个字段值
  • ctx.DefaultPostForm::获取from单个字段值,可设置默认值
  • ctx.PostFormArray:获取from多个相同key字段值
  • ctx.PostFormMap:获取frommap
Go
func postFormHanlder(ctx *gin.Context) {
	userName := ctx.PostForm("userName")
	password := ctx.PostForm("password")
	address := ctx.PostFormArray("address")
	addressMap := ctx.PostFormMap("addressMap")
	like := ctx.DefaultPostForm("like", "羽毛球")
	ctx.JSON(http.StatusOK, gin.H{
		"userName": userName,
		"password": password,
		"address": address,
		"addressMap": addressMap,
		"like": like,
	})
}

FormData

参数如上,返回如下:

json
{
    "address": [
        "shanghai",
        "beijing"
    ],
    "addressMap": {
        "p": "河南",
        "s": "郑州"
    },
    "like": "羽毛球",
    "password": "123455",
    "userName": "zhang"
}

json参数

  • ctx.ShouldBindJSON:设置json
Go
type User struct {
	UserName string `form:"user_name" json:"user_name"`
	Age int `form:"age" json:"age"`
	Address string `form:"address" json:"address" binding:"required"`
}

func postJsonHanlder(ctx *gin.Context) {
	var user User
	err := ctx.ShouldBindJSON(&user)
	if err != nil {
		fmt.Println("ctx.ShouldBindJSON", err)
	}
	ctx.JSON(http.StatusOK, user)
}

访问/post_json,传值如下

json
{
    "user_name": "222",
    "age": 66,
    "address": "shanghai"
}

响应如下:

json
{
    "user_name": "222",
    "age": 66,
    "address": "shanghai"
}

Param参数

  • ctx.Param:获取param
Go
func paramHanlder(ctx *gin.Context) {
	userName := ctx.Param("userName")
	age := ctx.Param("age")
	ctx.JSON(http.StatusOK, gin.H{"userName": userName, "age": age})
}

路由/get_param/:userName/:age,访问/get_param/zhang/22

json
{
    "age": "22",
    "userName": "zhang"
}