Gin参数接收
文章目录
1.各个参数的接收方法
- 声明: 这里的
c
都是c *gin.Context
中的c
Gin中发送JSON数据
-
在传输或接受JSON数据时,通常习惯通过创建结构体的方式存储数据
-
注意点:
-
- 结构体中成员名需要大写字母开头,否则无法访问
- 需要再成员名后添加tag标签 ,方便传输以及接收数据
-
-
方法
gofunc (c *Context) JSON(code int, obj any) { }
code
是状态码,例如:http.StatusOK
这是go语言内置变量obj
指需要传入的数据
-
代码案例:
gopackage 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中的
Gin接收querystring数据
-
介绍:
//querystring 数据是在URl上的参数,例如:https://www.bing.com/search?q=邓超 //这里的"q = 邓超"就是querystring,其中q是变量,邓超是值
-
方法:
c.Query(key)
:根据变量名接收值c.DefaultQuery(key,defaultValue)
:根据变量名接收值,如果没有该变量,就输出定义好的值c.GETQuery(key)
:返回值有两个,一个是接收到的值,一个是布尔值,可以通过判断布尔值查看是否接受到值
-
代码案例
gopackage 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的基本一致
-
代码:
gopackage 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参数
-
介绍
go//了解什么是URI参数 //例如一条URL为http://ouzhenxian.com/blog/2023/1 //这里的URL中,可以指定2023和1为参数(是否是参数是由你的接收格式决定的 //格式: "/blog/:year/:mouth",":"后面的参数就是需要被接收的数据
-
c.Param
方法和querystring用法基本一致 -
代码:
gopackage 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 } }
2.参数绑定方式接收(更加方便)
-
核心方法
c.ShouldBind()
-
优点: 相比前面的更加快捷高效
-
代码展示
gopackage 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)
- 例如:这里的JSON数据有--->
推荐一款软件
Postman
软件: 在做网络开发过程中可以非常方便的传输数据测试,有兴趣的可以自行查看,该软件需要科学