Gin参数接收

249 阅读5分钟

Gin参数接收

Gin参数接收各个参数的接收方法Gin中发送JSON数据Gin接收querystring数据Gin接收Form的参数Gin接收URI参数参数绑定方式接收(更加方便)推荐一款软件

各个参数的接收方法

  • 声明: 这里的c都是c *gin.Context中的c

Gin中发送JSON数据

  • 在传输或接受JSON数据时,通常习惯通过创建结构体的方式存储数据

  • 注意点:

      1. 结构体中成员名需要大写字母开头,否则无法访问
      2. 需要再成员名后添加tag标签 ,方便传输以及接收数据
  • 方法

     func (c *Context) JSON(code int, obj any) {
        
     }
    
    • code是状态码,例如:http.StatusOK这是go语言内置变量
    • obj指需要传入的数据
  • 代码案例:

     package main
     ​
     import (
         "github.com/gin-gonic/gin"
         "log"
         "net/http"
     )
     ​
     // User 构建数据结构(存储json数据
     // 注意:1.需要大写字母开头否则无法访问
     // 注意:2.`json`是tag标签,这样方便定义前端显示名称
     type User struct {
         Name   string `json:"name"`
         Gender string `json:"gender"`
         Age    int    `json:"age"`
     }
     ​
     func main() {
         //启动服务器
         r := gin.Default()
     ​
         //发起请求
         r.GET("/Json", func(c *gin.Context) {
             data := &User{
                 Name:   "贤哥",
                 Gender: "男",
                 Age:    18,
             }
             c.JSON(http.StatusOK, gin.H{
                 "data": data,
             })
         })
     ​
         //运行服务器
         err := r.Run(":9000")
         if err != nil {
             log.Println("启动错误:", err)
         }
     }
     ​
    
    • 传数据习惯用gin中的gin.H{}

Gin接收querystring数据

  • 介绍:

    •  //querystring 数据是在URl上的参数,例如:https://www.bing.com/search?q=邓超
       //这里的"q = 邓超"就是querystring,其中q是变量,邓超是值
      
  • 方法:

    • c.Query(key):根据变量名接收值
    • c.DefaultQuery(key,defaultValue):根据变量名接收值,如果没有该变量,就输出定义好的值
    • c.GETQuery(key):返回值有两个,一个是接收到的值,一个是布尔值,可以通过判断布尔值查看是否接受到值
  • 代码案例

     package main
     ​
     import (
         "github.com/gin-gonic/gin"
         "log"
         "net/http"
     )
     ​
     //querystring 数据是在URl上的参数,例如:https://www.bing.com/search?q=邓超
     //这里的"q = 邓超"就是querystring,其中q是变量,邓超是值
     ​
     type User struct {
         Name string `json:"name"`
         Age  string `json:"age"`
     }
     ​
     func main() {
         //创建Gin变量
         r := gin.Default()
     ​
         //发起请求
         r.GET("/query", func(c *gin.Context) {
             //单纯接收querystring的值
             data1 := c.Query("query")
     ​
             //接收querystring,如果没有接收到值就,输出定义好的值(类似这里的nothing)
             data2 := c.DefaultQuery("query", "nothing")
     ​
             //获取querystring的值,返回当前值和bool值,如何bool为false,默认返回空值
             data3, ok := c.GetQuery("query")
             if !ok {
                 data3 = "nothing"
             }
     ​
             //可以将querystring的值,解析到结构体中存储
             //注意:结构体的成员名和querystring的变量名必须一致,否则解析不到
             var user User
             err := c.BindQuery(&user)
             if err != nil {
                 log.Println(err)
                 return
             }
     ​
             //可以用于相同变量却有多个值的情况接收变量,接收后的变量会被保存在切片中
             //query=尼玛&query=tm 输出 "query4":["尼玛","tm"]
             data4 := c.QueryArray("query")
     ​
             //通过Json数据发出
             c.JSON(http.StatusOK, gin.H{
                 "query1": data1,
                 "query2": data2,
                 "query3": data3,
                 "query4": data4,
                 "user":   user,
             })
         })
     ​
         //启动服务器
         err := r.Run(":9000")
         if err != nil {
             log.Println("启动失败:", err)
         }
     }
     ​
    

Gin接收Form的参数

  • 结论: 方法的用法和querystring的基本一致

  • 代码:

     package main
     ​
     import (
         "github.com/gin-gonic/gin"
         "log"
         "net/http"
     )
     ​
     //任务:接收form的数据
     //1.创建form表单
     //2.解析数据
     ​
     func main() {
         r := gin.Default()
     ​
         //解析模板
         r.LoadHTMLFiles("./login.html", "./index.html")
     ​
         //渲染模板(渲染登录页面
         r.GET("/login", func(c *gin.Context) {
             c.HTML(http.StatusOK, "login.html", nil)
         })
     ​
         //点击form的登录按钮提交数据后会发起method方法的请求
         //所以得写一个post方法以及,输出数据到post渲染的网页
         r.POST("/login", func(c *gin.Context) {
             //单个接收表单数据
             //username := c.PostForm("username")
             password := c.PostForm("password")
     ​
             //单个接收表单的数据,如果没有参数就输出notDefault
             //username := c.DefaultPostForm("username", "notDefault")
     ​
             //以数组的方式接收值
             username := c.PostFormArray("username")
     ​
             //password, ok := c.GetPostForm("username")
     ​
             c.HTML(http.StatusOK, "index.html", gin.H{
                 "username": username[0],
                 "password": password,
             })
             //总结接收表单数据的各种函数基本和接收querystring参数的用法一致
         })
         //启动服务器
         err := r.Run(":9000")
         if err != nil {
             log.Println(err)
             return
         }
     }
     ​
    

Gin接收URI参数

  • 介绍

    •  //了解什么是URI参数
       //例如一条URL为http://ouzhenxian.com/blog/2023/1
       //这里的URL中,可以指定2023和1为参数(是否是参数是由你的接收格式决定的
       //格式: "/blog/:year/:mouth",":"后面的参数就是需要被接收的数据
      
  • c.Param方法和querystring用法基本一致

  • 代码:

     package main
     ​
     import (
         "github.com/gin-gonic/gin"
         "net/http"
     )
     func main() {
         r := gin.Default()
     ​
         r.GET("/blog/:year/:mouth", func(c *gin.Context) {
             year := c.Param("year")
             mouth := c.Param("mouth")
     ​
             c.JSON(http.StatusOK, gin.H{
                 "year":  year,
                 "mouth": mouth,
             })
         })
     ​
         //启动服务器
         err := r.Run(":9000")
         if err != nil {
             return
         }
     }
    

参数绑定方式接收(更加方便)

  • 核心方法c.ShouldBind()

  • 优点: 相比前面的更加快捷高效

  • 代码展示

     package main
     ​
     import (
         "fmt"
         "github.com/gin-gonic/gin"
         "log"
         "net/http"
     )
     ​
     //任务: 利用ShouldBind()函数绑定参数
     ​
     type UserInfo struct {
         Username string `json:"username"  form:"username" uri:"username" query:"username"` //注意2点: 字段名需要大写,需要写tag,否则找不到
         Password string `json:"password"  form:"password" uri:"password" query:"password"`
     }
     ​
     func main() {
         r := gin.Default()
     ​
         //发出请求
         r.GET("/json", func(c *gin.Context) {
             var user UserInfo
             err := c.ShouldBindJSON(&user) //注意:这里需要写&,否则是值传递,无法修改值
             if err != nil {
                 log.Println(err)
                 return
             }
             //处理数据
             fmt.Printf("%#v\n", user) //一起输出
             c.JSON(http.StatusOK, gin.H{
                 "status": "ok",
             })
         })
     ​
         r.GET("/query", func(c *gin.Context) {
             var user UserInfo
             err := c.ShouldBindQuery(&user) //注意:这里需要写&,否则是值传递,无法修改值
             if err != nil {
                 log.Println(err)
                 return
             }
             //处理数据
             fmt.Printf("%#v\n", user) //一起输出
             c.JSON(http.StatusOK, gin.H{
                 "status": "ok",
             })
         })
     ​
         r.POST("/form", func(c *gin.Context) {
             var user UserInfo
             err := c.ShouldBind(&user) //注意:这里需要写&,否则是值传递,无法修改
             if err != nil {
                 log.Println(err)
                 return
             }
             //处理数据
             fmt.Printf("%#v\n", user) //一起输出
             c.JSON(http.StatusOK, gin.H{
                 "status": "ok",
             })
         })
     ​
         r.GET("/uri/:username/:password", func(c *gin.Context) {
             var user UserInfo
             err := c.ShouldBindUri(&user) //注意:这里需要写&,否则是值传递,无法修改值
             if err != nil {
                 log.Println(err)
                 return
             }
             //处理数据
             fmt.Printf("%#v\n", user) //一起输出
             c.JSON(http.StatusOK, gin.H{
                 "status": "ok",
             })
         })
     ​
         //启动服务器
         err := r.Run(":8080")
         if err != nil {
             log.Println(err)
             return
         }
     ​
     }
    
  • 注意点:

    • 1.结构体成员名首字母大写
    • 2.需要指定tag
    • 3.ShouldBind()接受的值必须是地址值(例如:&user)
  • 说明: Gin框架中不是每个数据格式都有对应的ShouldBind函数

    • 例如:这里的JSON数据有--->c.ShouldBindJSON(&user),而这里的表单Form数据没有对应的和函数,那就使用通用的c.ShouldBind(&user)

推荐一款软件

  • Postman软件: 在做网络开发过程中可以非常方便的传输数据测试,有兴趣的可以自行查看,该软件需要科学