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”)
举个例子:

  1. func main() {
  2. //Default返回一个默认的路由引擎
  3. r := gin.Default()
  4. r.GET("/user/search", func(c *gin.Context) {
  5. username := c.DefaultQuery("username", "小王子")
  6. //username := c.Query("username")
  7. address := c.Query("address")
  8. //输出json结果给调用方
  9. c.JSON(http.StatusOK, gin.H{
  10. "message": "ok",
  11. "username": username,
  12. "address": address,
  13. })
  14. })
  15. r.Run()
  16. }

2. 获取form参数

  1. 当前端请求的数据通过form表单提交时,我们将该参数称作 form 参数,通常与**POST请求**相配。<br />获取form参数也有两个方法,c.DefaultPostForm c.PostForm 前者有默认值、后者无默认值。
  1. func main() {
  2. //Default返回一个默认的路由引擎
  3. r := gin.Default()
  4. r.POST("/user/search", func(c *gin.Context) {
  5. // DefaultPostForm取不到值时会返回指定的默认值
  6. username := c.DefaultPostForm("username", "小王子")
  7. // username := c.PostForm("username")
  8. address := c.PostForm("address")
  9. //输出json结果给调用方
  10. c.JSON(http.StatusOK, gin.H{
  11. "message": "ok",
  12. "username": username,
  13. "address": address,
  14. })
  15. })
  16. r.Run(":8080")
  17. }
  1. 上述代码测试结果:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619686927152-175c935d-6c6d-4e86-9d1b-8704cea5ef84.png#clientId=uc630d061-a51a-4&from=paste&height=554&id=u813f5b7c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=554&originWidth=1187&originalType=binary&size=67335&status=done&style=none&taskId=ue6684c69-e369-44e9-b451-84d3c0fa0ca&width=1187)

3. 获取JSON参数

当前端请求的数据通过JSON提交时,我将该参数称作 JSON 参数,通常与POST请求相配。另外,JSON参数是与前端交互中使用的最多的参数格式。JSON格式的数据一般是一个map,原生来讲,用 GetRawData() 来接收,会返回一个data和一个error。
但是data是一条原生数据,我们看不懂,需要通过 json.Unmarshall (data, &m) 来反序列化,其中m为一个 map[string]interface{ } 型的map。发序列化之后,map就存储着json发来的数据:

  1. func main() {
  2. //Default返回一个默认的路由引擎
  3. r := gin.Default()
  4. r.POST("/user/search", func(c *gin.Context) {
  5. data,err := c.GetRawData()
  6. var m map[string]interface{}
  7. _ = json.Unmarshal(data,&m)
  8. //输出json结果
  9. c.JSON(http.StatusOK, gin.H{
  10. "data": m,
  11. "err": err,
  12. })
  13. })
  14. r.Run(":8080")
  15. }
  1. 测试结果:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619687859017-f64bc575-6e3f-448d-aa4b-62b4f3528f51.png#clientId=uc630d061-a51a-4&from=paste&height=574&id=u5194c3e2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=574&originWidth=1186&originalType=binary&size=62302&status=done&style=none&taskId=ubba38df6-dbbd-47d9-8064-911d5a7b8de&width=1186)<br />不过一般不这样做,而是用后面将会介绍的,强大的 c.ShouldBind 方法

4. 获取URL参数

用于直接接收 URL 路径中包含的参数,如:/user/search/狗/阿拉斯加。由于不需要手动传参,所以通常与GET请求 相配。
在GET请求的URL里,需要用到的 字段key 前要用冒号 ‘ : ‘ 标注,可以标多个,但每个 /…/ 之间只能标一个。
使用的方法为:c.Param(“key”),也需要实例来接收
举个例子:

  1. func main() {
  2. //Default返回一个默认的路由引擎
  3. r := gin.Default()
  4. r.GET("/user/search/:username/:address", func(c *gin.Context) {
  5. username:= c.Param("username")
  6. address:= c.Param("address")
  7. //输出json结果
  8. c.JSON(http.StatusOK, gin.H{
  9. "username": username,
  10. "address": address,
  11. })
  12. })
  13. r.Run(":8080")
  14. }

测试结果:
image.png


5. 参数绑定与ShouldBind

为了能够更方便的获取请求中的相关参数,提高开发效率,我们可以基于 c.ShouldBind 识别请求的数据类型并利用反射机制自动提取请求中 QueryString、form表单、JSON、XML 等参数到 结构体 中。下面的示例代码将演示 c.ShouldBind(&…) 的强大功能,它能够基于请求 自动提取 JSON、form表单 和 QueryString 类型的数据,并把值绑定到指定的 结构体对象 中。

  1. func main() {
  2. router := gin.Default()
  3. // 绑定JSON的示例 ({"user": "q1mi", "password": "123456"})
  4. router.POST("/loginJSON", func(c *gin.Context) {
  5. var login Login
  6. // ShouldBind()会根据请求的Content-Type自行选择绑定器
  7. if err := c.ShouldBind(&login); err == nil {
  8. c.JSON(http.StatusOK, gin.H{
  9. "login":login,
  10. })
  11. } else {
  12. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  13. }
  14. })
  15. // 绑定form表单示例 (user=q1mi&password=123456)
  16. router.POST("/loginForm", func(c *gin.Context) {
  17. var login Login
  18. // ShouldBind()会根据请求的Content-Type自行选择绑定器
  19. if err := c.ShouldBind(&login); err == nil {
  20. c.JSON(http.StatusOK, gin.H{
  21. "login":login,
  22. })
  23. } else {
  24. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  25. }
  26. })
  27. // 绑定QueryString示例 (/loginQuery?user=q1mi&password=123456)
  28. router.GET("/loginQuery", func(c *gin.Context) {
  29. var login Login
  30. // ShouldBind()会根据请求的Content-Type自行选择绑定器
  31. if err := c.ShouldBind(&login); err == nil {
  32. c.JSON(http.StatusOK, gin.H{
  33. "login":login,
  34. })
  35. } else {
  36. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  37. }
  38. })
  39. // Listen and serve on 0.0.0.0:8080
  40. router.Run(":8080")
  41. }
  1. JSON测试:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619689190169-6c4c6ced-591f-4c0a-b156-e0e11eb8b8d0.png#clientId=uc630d061-a51a-4&from=paste&height=502&id=u600f57e9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=502&originWidth=1174&originalType=binary&size=54459&status=done&style=none&taskId=uf1bf2112-5210-4db0-9c79-5772c570063&width=1174)<br />form表单测试:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619689264105-a983eccb-4507-4df6-baed-703c1ead848c.png#clientId=uc630d061-a51a-4&from=paste&height=508&id=u7e735384&margin=%5Bobject%20Object%5D&name=image.png&originHeight=508&originWidth=1185&originalType=binary&size=56318&status=done&style=none&taskId=u85302132-224f-4457-b2f9-777ac494b4d&width=1185)<br />QueryString测试:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2643809/1619689378266-ee96aa90-7ae6-45f4-877e-d090a2cfbdd7.png#clientId=uc630d061-a51a-4&from=paste&height=552&id=ua1e7561e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=552&originWidth=1185&originalType=binary&size=59896&status=done&style=none&taskId=uc8b383cc-adda-42a0-89f4-bd06cd67fc8&width=1185)<br />因此只要遇到参数获取,不过是什么格式,第一时间就应该想到 c.ShouldBind(&struct) 方法。