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
軟件: 在做網絡開發過程中可以非常方便的傳輸數據測試,有興趣的可以自行查看,該軟件需要科學