Gin参数接收
文章目录
- Gin参数接收
- 1.各个参数的接收方法
- Gin中发送JSON数据
- Gin接收querystring数据
- Gin接收Form的参数
- Gin接收URI参数
- 2.参数绑定方式接收(更加方便)
- 推荐一款软件
1.各个参数的接收方法
- 声明: 这里的
c
都是c *gin.Context
中的c
Gin中发送JSON数据
-
在传输或接受JSON数据时,通常习惯通过创建结构体的方式存储数据
-
注意点:
-
- 结构体中成员名需要大写字母开头,否则无法访问
- 需要再成员名后添加tag标签 ,方便传输以及接收数据
-
-
方法
func (c *Context) JSON(code int, obj any) {}
code
是状态码,例如:http.StatusOK
这是go语言内置变量obj
指需要传入的数据
-
代码案例:
package mainimport ("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)
:返回值有两个,一个是接收到的值,一个是布尔值,可以通过判断布尔值查看是否接受到值
-
代码案例
package mainimport ("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 Usererr := 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 mainimport ("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 mainimport ("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()
-
优点: 相比前面的更加快捷高效
-
代码展示
package mainimport ("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 UserInfoerr := 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 UserInfoerr := 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 UserInfoerr := 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 UserInfoerr := 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
软件: 在做网络开发过程中可以非常方便的传输数据测试,有兴趣的可以自行查看,该软件需要科学