URI参数
普通参数
普通参数就像这样http://localhost:8080/save?id=11&name=aka
在URI中传输普通参数使用?符号。
接收普通参数一共有三个函数:
Query函数会获取参数,如果没有获取到会返回零值。
r.GET("/save", func(ctx *gin.Context) {
id := ctx.Query("id")
name := ctx.Query("name")
ctx.JSON(200, gin.H{
"id": id,
"name": name,
})
})
DefaultQuery函数同样可以用来获取参数,不过如果没有获取到会返回你自己设置的默认值:
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,
})
})
GetQuery函数在获取时会判断有没有该参数,没有的话会返回错误值,所以该函数有两个返回值:
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,
})
})
关于参数, gin 也同样支持通过结构体匹配,这时你需要使用BindQuery和ShouldBindQuery两个函数,不过我们一般推荐使用后者,它可以让你选择哪种参数是必须要有的,如果没有就会报错。
//结构体
type User struct {
Id int64 `form:"id"`
Name string `form:"name"`
Address string `form:"address" binding:"required"`
}
//函数部分
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)
})
这个时候, address 参数是必要的,如果没有就会返回错误
数组参数
URI 中也可以传入类似数组的参数,就像这样:
http://localhost:8080/user/save?address=Beijing&address=shanghai
数组参数与普通参数比较相似。
这里能使用函数只有两个,分别是QueryArray和GetQueryArray,效果和之前的普通参数是一样的。接收数组参数的DefaultQuery函数是没有的。
数组参数同样也支持ShouldBindQuery函数。
map参数
URI 参数除了普通参数外还支持 map 参数。就像这样:
http://localhost:8080/user/save?addressMap[home]=Beijing&addressMap[company]=shanghai
和数组参数有点像的是,它也同样有两个函数可以使用,QueryMap和GetQueryMap。不过,与数组参数不同的是,它不能使用ShouldBindMap。也就是说,你不能 用结构体bind map 参数。
表单参数
表单参数并不是非常直观可见,它不在网址上肉眼可见,而是包装在连接请求时的信息当中去了,需要一些步骤才能看见他们。在接收这些参数时,需要和 URI 请求不一样的函数来接收他们。
不过和 URI 参数类似,表单参数接收的函数也是差不太多的。
首先就是根据参数名称接收
r.POST("/user/save", func(ctx *gin.Context) {
id := ctx.PostForm("id")
name,ok := ctx.GetPostForm("name")
address := ctx.PostFormArray("address")
addressMap := ctx.PostFormMap("addressMap")
})
注意,表单接收函数一定有 PostForm ,前面有 Get 就是会不会返回参数不存在,后面则是如果是数组类型或者是 map 类型就要对应加 Array 和 Map
当然了,一般会更推荐使用结构体来接收,比较方便也好理解。
r.POST("/user/save", func(ctx *gin.Context) {
var user User
err := ShouldBind(&user)
})
这样就可以通过结构体接收参数了,读取到的数据都会在传入的结构体变量 user 中。
路径参数
其实和 URI 比较像,都是在网址上传参。传参的方法是这样:
http://localhost:8080/user/save/:id
然后在代码中也是根据 id 接收参数,像这样
r.POST("/user/save/:id", func(ctx *gin.Context) {
id := ctx.Param("id")
ctx.JSON(200, id)
})