获取querystring参数
一般是指获取直接在url处的参数的值,也就是GET的数据。
假如url是这样的:/user/info/?u=”张三”&id=1,如果获取张三和1。
package main
import (
"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 main
import (
"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 main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//定义一个通用结构体
type Login struct {
User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写user
Pass 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路径时,调用getlogin
router.Run(":9090") //绑定0.0.0.0:9090
}
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22872200/1658292446646-73a6c14e-3f43-43b6-b739-b5ba1f6e7651.png#clientId=u9590fc47-1b60-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=133&id=u172e5a1d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=133&originWidth=628&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6566&status=done&style=none&taskId=u08c88681-460a-40f6-a13b-ec4df11b4b8&title=&width=628)
POST
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//定义一个结构体,定义需要获取的参数,这里获取user和pass参数的数据
type Login struct {
User string `json:"user" form:"user"` //这个意思是当用json或form来反射解析的时候,用user代替User,这样就能在前端输出小写user
Pass 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路径时,调用getlogin
router.POST("/login", formlogin) //POST请求/login路径时,调用formlogin
router.Run(":9090") //绑定0.0.0.0:9090
}
可以看到,实际上,新增的formlogin函数,和getlogin是一模一样的,这就是参数绑定的意思,不用为每种格式都定义一个函数。
shuoldbind会识别请求格式,如果是GET请求,会使用form引擎绑定query参数。如果是POST请求,先根据Content-Type判断是json或xml,然后再使用form(form-data)。