JSON渲染
func main(){ r := gin.Default() r.GET("/someJSON",func(c *gin.Context){ c.JSON(http.StatusOK, gin.H{"meaage":"Hello world!"}) }) r.GET("/moreJSON",func(c *gin.Context){ var msg struct { Name string `json:"user"` Message string Age int } msg.Name = "小王子" msg.Message = "Hello world!" msg.age = 18 c.JSON(http.StatusOK,msg) // JSON的序列化 }) r.Run(":8080") }
獲取參數
獲取querystring參數
querystring指的是URL中?後面攜帶的參數,例如:/user/search?username=小王子&address=沙河。
獲取請求querystring參數的方法如下:
func main(){ r := gin.Default() r.GET("/user/search",func(c *gin.Context){ username := c.DefaultQuery("username","小王子") address := c.Query("address") c.JSON(http.StatucOK, gin.H{ "message":"ok", "username":username, "address":address, }) }) r.Run() }
例子:
package main import ( "github.com.gin-gonic/gin" ) func main(){ r := gin.Default() r.GET("/web", func(c *gin.Context){ name := c.Query("query") // 通過Query獲取請求中攜帶的querystring參數 age := c.Query("age") c.JSON(http.StatusOk, gin.H{ "name":name, "age":age, }) }) r.Run(":9090") }
獲取form參數
請求的數據通過form表單來提交,例如向/user/search發送一個POST請求,獲取請求數據的方式如下:
func main (){ r := gin.Default() r.POST("/user/search", func(c *gin.Context){ username := c.PostForm("username") Address := c.PostForm("address") c.JSON(http.StatusOK, gin.H{ "message":"ok", "username":username, "address":address, }) }) r.Run(":8080") }
例子:main.go
package main import ( "github.com/gin-gonic/gin" ) 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) }) r.POST("/login",func(c *gin.Context){ // 匿名函數等待form表單裡的用戶名和密碼 username, ok := c.GetPostForm("username") if !ok { username = "somebody" } password, ok := c.GetPostForm("password") if !ok { password = "******" } c.HTML(http.StatusOK, "index.html", gin.H{ "Name": username, "Password": password, }) }) r.Run(":9090") }
// login.html
(注意:一次請求對應一次響應,一個請求可能對應相同的地址,當時對應的方法可能不同)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <form action="/login" method="post" novalidate autocomplete="off"> <div> <label for="username">username:</label> <input type="text" name="username" id="username"> </div> <div> <label for="passwor">password:</label> <input type="password" name-="password" id="password"> </div> <div> <input type="submit" value="登錄"> </div> </form> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta cheset="UTF-8"> <title>index</title> </head> <body> <h1>Hello, {{ .Name }}!</h1> <p>你的密碼是:{{ .Password }}</p> </body> </html>
獲取path(URL)參數
請求的參數通過URL路徑傳遞。例如:/user/search/小王子、沙河
獲取請求URL路徑中的參數的方式如下:
func main(){ r := gin.Default() r.GET("/user/search/:username/:address", func(c *gin.Context){ username := c.Param("username") adderss := c.Param("address") c.JSON(http.StatusOK, gin.H{ "message": "ok", "username": username, "address": address, }) }) r.Run(":8080") }
例子:main.go
package main import ( "github.com/gin-ginic/gin" ) func main(){ r := gin.Default() r.GET("/user/:name/:age", func(c *gin.Context){ name := c.Param("name") age := c.Param("age") // string類型 c.JSON(http.StatusOK, gin.H{ "name": name, "age":age, }) }) r.GET("/blog/:year/:month", func(c *gin.Context){ year := c.Param("year") month := c.Param("month") c.JSON(http.StatusOK, gin.H{ "year": year, "month":month, }) }) r.Run(":9090") }
參數綁定(前耑請求參數與後耑結構體進行綁定)
爲了更方便的獲取請求相關參數,提高開發效率。可以基於請求的Content-Type識別請求數據類型並利用反射機制自動提取請求中QueryString、form表單、JSON、XML等參數到結構體中。
示例代碼演示了:.ShouldBind()強大的功能,它能夠基於請求自動提取JSON、form表單和QueryString類型的數據,並把值綁定到指定的結構體對象。
// Bindding from JSON type Login struct { User string `form:"user" json:"user" binding:"rquired"` Password string `form:"password" json:"password" binding:"rewuired"` } func main(){ router := gin.Default() router.POST("/loginJSON", func(c *gin.Context){ var login Login if err := c.ShouldBind(&login); err == nil { fmt.Printf("login info:%#v\n", login) c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) router.POST("loginForm", func(c *gin.Context){ var login Login if err := c.ShouleBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) router.GET("loginForm", func(c *gin.Context){ var login Login if err := c.ShouldBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()}) } }) router.Run(":8080") }
ShouldBind會按照下面的順序解析請求中的數據完成綁定:
1.如果是GET請求,只使用Form綁定引擎(query)。
2.如果是POST請求,首先檢查Content-Type是否爲JSON或XML,然後在使用Form(form-data)。