gin传参(URI/表单/路径参数)|青训营

215 阅读3分钟

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 也同样支持通过结构体匹配,这时你需要使用BindQueryShouldBindQuery两个函数,不过我们一般推荐使用后者,它可以让你选择哪种参数是必须要有的,如果没有就会报错。

//结构体
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

数组参数与普通参数比较相似。

这里能使用函数只有两个,分别是QueryArrayGetQueryArray,效果和之前的普通参数是一样的。接收数组参数的DefaultQuery函数是没有的。

数组参数同样也支持ShouldBindQuery函数。

map参数

URI 参数除了普通参数外还支持 map 参数。就像这样:

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

和数组参数有点像的是,它也同样有两个函数可以使用,QueryMapGetQueryMap。不过,与数组参数不同的是,它不能使用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)
	})