1. 获取QueryString参数
QueryString 参数指的是URL中 ? 后面携带的参数,是 key-value 结构,例如:/user/search?username=小王子&address=沙河。顾名思义,query为查询之意,因此常与GET请求相配。
获取QueryString的方法一般有两个:c.DefaultQuery(“…” string, “…” string ) 和 c.Query(“…” string )。其中,c.DefaultQuery 的第一个string参数为字段的key,第二参数为字段的默认值;而 c.Query 没有默认值,只需要传入key就行。
二者都是获取参数,因此必须要有个实例来接收参数,所以一般用类型推导=>
key := c.Query(“key”)
举个例子:
func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.GET("/user/search", func(c *gin.Context) {
username := c.DefaultQuery("username", "小王子")
//username := c.Query("username")
address := c.Query("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run()
}
2. 获取form参数
当前端请求的数据通过form表单提交时,我们将该参数称作 form 参数,通常与**POST请求**相配。<br />获取form参数也有两个方法,c.DefaultPostForm 和 c.PostForm 前者有默认值、后者无默认值。
func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.POST("/user/search", func(c *gin.Context) {
// DefaultPostForm取不到值时会返回指定的默认值
username := c.DefaultPostForm("username", "小王子")
// username := c.PostForm("username")
address := c.PostForm("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run(":8080")
}
上述代码测试结果:<br />
3. 获取JSON参数
当前端请求的数据通过JSON提交时,我将该参数称作 JSON 参数,通常与POST请求相配。另外,JSON参数是与前端交互中使用的最多的参数格式。JSON格式的数据一般是一个map,原生来讲,用 GetRawData() 来接收,会返回一个data和一个error。
但是data是一条原生数据,我们看不懂,需要通过 json.Unmarshall (data, &m) 来反序列化,其中m为一个 map[string]interface{ } 型的map。发序列化之后,map就存储着json发来的数据:
func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.POST("/user/search", func(c *gin.Context) {
data,err := c.GetRawData()
var m map[string]interface{}
_ = json.Unmarshal(data,&m)
//输出json结果
c.JSON(http.StatusOK, gin.H{
"data": m,
"err": err,
})
})
r.Run(":8080")
}
测试结果:<br /><br />不过一般不这样做,而是用后面将会介绍的,强大的 c.ShouldBind 方法
4. 获取URL参数
用于直接接收 URL 路径中包含的参数,如:/user/search/狗/阿拉斯加。由于不需要手动传参,所以通常与GET请求 相配。
在GET请求的URL里,需要用到的 字段key 前要用冒号 ‘ : ‘ 标注,可以标多个,但每个 /…/ 之间只能标一个。
使用的方法为:c.Param(“key”),也需要实例来接收
举个例子:
func main() {
//Default返回一个默认的路由引擎
r := gin.Default()
r.GET("/user/search/:username/:address", func(c *gin.Context) {
username:= c.Param("username")
address:= c.Param("address")
//输出json结果
c.JSON(http.StatusOK, gin.H{
"username": username,
"address": address,
})
})
r.Run(":8080")
}
测试结果:
5. 参数绑定与ShouldBind
为了能够更方便的获取请求中的相关参数,提高开发效率,我们可以基于 c.ShouldBind 识别请求的数据类型并利用反射机制自动提取请求中 QueryString、form表单、JSON、XML 等参数到 结构体 中。下面的示例代码将演示 c.ShouldBind(&…) 的强大功能,它能够基于请求 自动提取 JSON、form表单 和 QueryString 类型的数据,并把值绑定到指定的 结构体对象 中。
func main() {
router := gin.Default()
// 绑定JSON的示例 ({"user": "q1mi", "password": "123456"})
router.POST("/loginJSON", func(c *gin.Context) {
var login Login
// ShouldBind()会根据请求的Content-Type自行选择绑定器
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"login":login,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 绑定form表单示例 (user=q1mi&password=123456)
router.POST("/loginForm", func(c *gin.Context) {
var login Login
// ShouldBind()会根据请求的Content-Type自行选择绑定器
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"login":login,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 绑定QueryString示例 (/loginQuery?user=q1mi&password=123456)
router.GET("/loginQuery", func(c *gin.Context) {
var login Login
// ShouldBind()会根据请求的Content-Type自行选择绑定器
if err := c.ShouldBind(&login); err == nil {
c.JSON(http.StatusOK, gin.H{
"login":login,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}
JSON测试:<br /><br />form表单测试:<br /><br />QueryString测试:<br /><br />因此只要遇到参数获取,不过是什么格式,第一时间就应该想到 c.ShouldBind(&struct) 方法。