全网最强 Gin 教程 | Gin 请求参数

📅 2026/6/28 2:29:27
全网最强 Gin 教程 | Gin 请求参数
请求参数1. Get请求参数使用Get请求传参时类似于这样http://localhost:8080/user/save?id11namezhangsan。如何获取呢1.1 普通参数request url:http://localhost:8080/user/save?id11namezhangsanr.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类型根据类型获取typeUserstruct{Idint64form:idNamestringform:name}r.GET(/user/save,func(ctx*gin.Context){varuser User err:ctx.BindQuery(user)iferr!nil{log.Println(err)}ctx.JSON(200,user)})也可以r.GET(/user/save,func(ctx*gin.Context){varuser User err:ctx.ShouldBindQuery(user)iferr!nil{log.Println(err)}ctx.JSON(200,user)})区别typeUserstruct{Idint64form:idNamestringform:nameAddressstringform:address binding:required}当bind是必须的时候ShouldBindQuery会报错开发者自行处理状态码不变。BindQuery则报错的同时会将状态码改为400。所以一般建议是使用Should开头的bind。1.2 数组参数请求urlhttp://localhost:8080/user/save?addressBeijingaddressshanghair.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){varuser User err:ctx.ShouldBindQuery(user)fmt.Println(err)ctx.JSON(200,user)})1.3 map参数请求urlhttp://localhost:8080/user/save?addressMap[home]BeijingaddressMap[company]shanghair.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){varuser User err:ctx.ShouldBind(user)addressMap,_:ctx.GetPostFormMap(addressMap)user.AddressMapaddressMap 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){varuser User err:ctx.ShouldBindJSON(user)fmt.Println(err)ctx.JSON(200,user)})其他类型参数注入xmlyaml等和json道理一样3. 路径参数请求urlhttp://localhost:8080/user/save/111r.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()iferr!nil{log.Println(err)}files:form.Filefor_,fileArray:rangefiles{for_,v:rangefileArray{ctx.SaveUploadedFile(v,./v.Filename)}}ctx.JSON(200,form.Value)})