获取querystring参数
querystring
指的是URL中 ?
后面携带的参数,例如:http://127.0.0.1:9090/web?query=杨超越
。 获取请求的querystring参数的方法如下:
方法1: Query
package main// querystringimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/web", func(c *gin.Context) {// 获取浏览器那边发请求携带的 query string 参数name := c.Query("query") // 通过Query获取请求中携带的querystring参数c.JSON(http.StatusOK, gin.H{"name": name,})})r.Run(":9090")
}
方法2: DefaultQuery
package main// querystringimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/web", func(c *gin.Context) {// 获取浏览器那边发请求携带的 query string 参数name := c.DefaultQuery("query", "somebody") // 取不到就用指定的默认值c.JSON(http.StatusOK, gin.H{"name": name,})})r.Run(":9090")
}
方法3: GetQuery
package main// querystringimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/web", func(c *gin.Context) {// 获取浏览器那边发请求携带的 query string 参数// 取到返回(值, true),取不到返回("", false)name, ok := c.GetQuery("query") if !ok {// 取不到name = "somebody"}c.JSON(http.StatusOK, gin.H{"name": name,})})r.Run(":9090")
}
获取多个参数
package main// querystringimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/web", func(c *gin.Context) {// 获取浏览器那边发请求携带的 query string 参数name := c.Query("query")age := c.Query("age")c.JSON(http.StatusOK, gin.H{"name": name,"age": age,})})r.Run(":9090")
}
总结
- GET请求 URL
?
后面的是querystring参数 key=value
格式,多个key-value用&
连接
eg.
/web/query=小王子&age=18
获取form参数
login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body><form action="/login" method="post" novalidate autocapitalize="off"><div><label for="username">username:</label><input type="text" name="username" id="username"></div><div><label for="password">password:</label><input type="password" name="password" id="password"></div><div><input type="submit" value="登录"></div>
</form></body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>index</title>
</head>
<body>
<h1>Hello, {{ .Name }}!</h1>
<p>你的密码是:{{ .Password }}</p>
</body>
</html>
main.go
package mainimport ("github.com/gin-gonic/gin""net/http"
)// 获取form表单提交的参数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)})// 发请求:访问 /login 的post请求r.POST("/login", func(c *gin.Context) {// 获取form表单的数据/*方法1:PostFormusername := c.PostForm("username")password := c.PostForm("password")*//*方法2:DefaultPostFormusername := c.DefaultPostForm("username", "somebody") // 取到返回值,取不到返回空字符串password := c.DefaultPostForm("password", "somebody")*/// 方法3:GetPostFormusername, ok := c.GetPostForm("username")if !ok {username = "sb"}password, ok := c.GetPostForm("password")if !ok {password = "***"}c.HTML(http.StatusOK, "index.html", gin.H{"Name": username,"Password": password,})})r.Run(":9090")
}
gin获取URI路径参数
一个
package mainimport ("github.com/gin-gonic/gin""net/http"
)// 获取请求的path(URI)参数,返回的都是字符串类型func main() {r := gin.Default()r.GET("/: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.Run(":9090")
}
多个
package mainimport ("github.com/gin-gonic/gin""net/http"
)// 获取请求的path(URI)参数,返回的都是字符串类型
// 注意URI的匹配不要冲突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")
}
gin参数绑定:ShouldBind
package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)type UserInfo struct {Username string `form:"username" json:"username"`Password string `form:"password" json:"password"`
}func main() {r := gin.Default()r.GET("/user", func(c *gin.Context) {/*username := c.Query("username")password := c.Query("password")u := UserInfo{username,password,}*/var u UserInfo // 声明一个UserInfo类型的变量uerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})} else {fmt.Printf("%#V\n", u)c.JSON(http.StatusOK, gin.H{"status": "ok",})}})r.POST("/form", func(c *gin.Context) {var u UserInfo // 声明一个UserInfo类型的变量uerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})} else {fmt.Printf("%#V\n", u)c.JSON(http.StatusOK, gin.H{"status": "ok",})}})r.POST("/json", func(c *gin.Context) {var u UserInfo // 声明一个UserInfo类型的变量uerr := c.ShouldBind(&u)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})} else {fmt.Printf("%#V\n", u)c.JSON(http.StatusOK, gin.H{"status": "ok",})}})r.Run(":9090")
}
user
form
json
总结
ShouldBind
会按照下面的顺序解析请求中的数据完成绑定:
- 如果是 GET 请求,只使用 Form 绑定引擎(query)。
- 如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form (form-data)。