获取querystring参数
一般是指获取直接在url处的参数的值,也就是GET的数据。
假如url是这样的:/user/info/?u=”张三”&id=1,如果获取张三和1。
package mainimport ("net/http""github.com/gin-gonic/gin")func userinfo(c *gin.Context) {username := c.DefaultQuery("user", "李四") //获取user参数的值,默认是李四,没输入,就打印李四id := c.Query("id") //获取id参数的值c.JSON(http.StatusOK, gin.H{ //返回浏览器的信息"msg": "这是你的信息","username": username,"id": id,})}func main() {router := gin.Default() //定义默认路由router.GET("/user/info", userinfo) //访问/user/info,触发userinfo函数router.Run(":9090") //监听127.0.0.1:9090}

当没输入的时候,默认是返回空值,比如上图的id,username因为默认是李四。
当有输入的时候,会返回获取到的输入的信息:
获取表单参数
使用postman工具发送post请求。
package mainimport ("net/http""github.com/gin-gonic/gin")func userinfo(c *gin.Context) {username := c.DefaultQuery("user", "李四") //获取user参数的值,默认是李四,没输入,就打印李四id := c.Query("id") //获取id参数的值c.JSON(http.StatusOK, gin.H{ //返回浏览器的信息"msg": "这是你的信息","username": username,"id": id,})}func adminlogin(c *gin.Context) {user := c.PostForm("username")passwd := c.PostForm("password")c.JSON(http.StatusOK, gin.H{"msg": "登录成功","账号": user,"密码": passwd,})}func main() {router := gin.Default() //定义默认路由router.GET("/user/info", userinfo) //访问/json,触发hellojson函数router.POST("/admin/login", adminlogin) //获取表单,要post方法router.Run(":9090") //监听127.0.0.1:9090}
参数绑定
更多的时候,前端请求不是把参数放在url,也不是表单,而是json或者xml格式的,为了能一个方案获取到所有的格式参数,才有了参数绑定,使用shouldbind函数。
GET
package mainimport ("net/http""github.com/gin-gonic/gin")//定义一个通用结构体type Login struct {User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写userPass string `json:"pass" form:"pass"`}//GET 示例(/login?user=admin&pass=123456)func getlogin(c *gin.Context) {var login Login //实例化结构c.ShouldBind(&login) //get到的数据,绑定到login结构体c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套"msg": "Get登录","账号": login.User,"密码": login.Pass,})}func main() {router := gin.Default() //定义默认路由router.GET("/login", getlogin) //GET请求/login路径时,调用getloginrouter.Run(":9090") //绑定0.0.0.0:9090}

POST
package mainimport ("net/http""github.com/gin-gonic/gin")//定义一个结构体,定义需要获取的参数,这里获取user和pass参数的数据type Login struct {User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写userPass string `json:"pass" form:"pass"`}//GET 示例(/login?user=admin&pass=123456)func getlogin(c *gin.Context) {var login Login //实例化结构体c.ShouldBind(&login) //获取到user和pass参数的数据c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套"msg": "Get登录","账号": login.User,"密码": login.Pass,})}//form 示例func formlogin(c *gin.Context) {var login Login //实例化结构体c.ShouldBind(&login) //获取到user和pass参数的数据c.JSON(http.StatusOK, gin.H{ //gin.H其实就是map[string]interface{}的缩写,可嵌套"msg": "form登录","账号": login.User,"密码": login.Pass,})}func main() {router := gin.Default() //定义默认路由router.GET("/login", getlogin) //GET请求/login路径时,调用getloginrouter.POST("/login", formlogin) //POST请求/login路径时,调用formloginrouter.Run(":9090") //绑定0.0.0.0:9090}

可以看到,实际上,新增的formlogin函数,和getlogin是一模一样的,这就是参数绑定的意思,不用为每种格式都定义一个函数。
shuoldbind会识别请求格式,如果是GET请求,会使用form引擎绑定query参数。如果是POST请求,先根据Content-Type判断是json或xml,然后再使用form(form-data)。
