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)。