获取querystring参数

一般是指获取直接在url处的参数的值,也就是GET的数据。
假如url是这样的:/user/info/?u=”张三”&id=1,如果获取张三和1。

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func userinfo(c *gin.Context) {
  7. username := c.DefaultQuery("user", "李四") //获取user参数的值,默认是李四,没输入,就打印李四
  8. id := c.Query("id") //获取id参数的值
  9. c.JSON(http.StatusOK, gin.H{ //返回浏览器的信息
  10. "msg": "这是你的信息",
  11. "username": username,
  12. "id": id,
  13. })
  14. }
  15. func main() {
  16. router := gin.Default() //定义默认路由
  17. router.GET("/user/info", userinfo) //访问/user/info,触发userinfo函数
  18. router.Run(":9090") //监听127.0.0.1:9090
  19. }

image.png
当没输入的时候,默认是返回空值,比如上图的id,username因为默认是李四。
当有输入的时候,会返回获取到的输入的信息:
image.png

获取表单参数

使用postman工具发送post请求。

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func userinfo(c *gin.Context) {
  7. username := c.DefaultQuery("user", "李四") //获取user参数的值,默认是李四,没输入,就打印李四
  8. id := c.Query("id") //获取id参数的值
  9. c.JSON(http.StatusOK, gin.H{ //返回浏览器的信息
  10. "msg": "这是你的信息",
  11. "username": username,
  12. "id": id,
  13. })
  14. }
  15. func adminlogin(c *gin.Context) {
  16. user := c.PostForm("username")
  17. passwd := c.PostForm("password")
  18. c.JSON(http.StatusOK, gin.H{
  19. "msg": "登录成功",
  20. "账号": user,
  21. "密码": passwd,
  22. })
  23. }
  24. func main() {
  25. router := gin.Default() //定义默认路由
  26. router.GET("/user/info", userinfo) //访问/json,触发hellojson函数
  27. router.POST("/admin/login", adminlogin) //获取表单,要post方法
  28. router.Run(":9090") //监听127.0.0.1:9090
  29. }

image.png

参数绑定

更多的时候,前端请求不是把参数放在url,也不是表单,而是json或者xml格式的,为了能一个方案获取到所有的格式参数,才有了参数绑定,使用shouldbind函数。

GET

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. //定义一个通用结构体
  7. type Login struct {
  8. User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写user
  9. Pass string `json:"pass" form:"pass"`
  10. }
  11. //GET 示例(/login?user=admin&pass=123456)
  12. func getlogin(c *gin.Context) {
  13. var login Login //实例化结构
  14. c.ShouldBind(&login) //get到的数据,绑定到login结构体
  15. c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套
  16. "msg": "Get登录",
  17. "账号": login.User,
  18. "密码": login.Pass,
  19. })
  20. }
  21. func main() {
  22. router := gin.Default() //定义默认路由
  23. router.GET("/login", getlogin) //GET请求/login路径时,调用getlogin
  24. router.Run(":9090") //绑定0.0.0.0:9090
  25. }
  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22872200/1658292446646-73a6c14e-3f43-43b6-b739-b5ba1f6e7651.png#clientId=u9590fc47-1b60-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=133&id=u172e5a1d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=133&originWidth=628&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6566&status=done&style=none&taskId=u08c88681-460a-40f6-a13b-ec4df11b4b8&title=&width=628)

POST

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. //定义一个结构体,定义需要获取的参数,这里获取user和pass参数的数据
  7. type Login struct {
  8. User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写user
  9. Pass string `json:"pass" form:"pass"`
  10. }
  11. //GET 示例(/login?user=admin&pass=123456)
  12. func getlogin(c *gin.Context) {
  13. var login Login //实例化结构体
  14. c.ShouldBind(&login) //获取到user和pass参数的数据
  15. c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套
  16. "msg": "Get登录",
  17. "账号": login.User,
  18. "密码": login.Pass,
  19. })
  20. }
  21. //form 示例
  22. func formlogin(c *gin.Context) {
  23. var login Login //实例化结构体
  24. c.ShouldBind(&login) //获取到user和pass参数的数据
  25. c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套
  26. "msg": "form登录",
  27. "账号": login.User,
  28. "密码": login.Pass,
  29. })
  30. }
  31. func main() {
  32. router := gin.Default() //定义默认路由
  33. router.GET("/login", getlogin) //GET请求/login路径时,调用getlogin
  34. router.POST("/login", formlogin) //POST请求/login路径时,调用formlogin
  35. router.Run(":9090") //绑定0.0.0.0:9090
  36. }

image.png
可以看到,实际上,新增的formlogin函数,和getlogin是一模一样的,这就是参数绑定的意思,不用为每种格式都定义一个函数。
shuoldbind会识别请求格式,如果是GET请求,会使用form引擎绑定query参数。如果是POST请求,先根据Content-Type判断是json或xml,然后再使用form(form-data)。