1. 获取QueryString参数
QueryString 参数指的是URL中 ? 后面携带的参数,是 key-value 结构,例如:/user/search?username=小王子&address=沙河。顾名思义,query为查询之意,因此常与GET请求相配。
获取QueryString的方法一般有两个:c.DefaultQuery(“…” string, “…” string ) 和 c.Query(“…” string )。其中,c.DefaultQuery 的第一个string参数为字段的key,第二参数为字段的默认值;而 c.Query 没有默认值,只需要传入key就行。
二者都是获取参数,因此必须要有个实例来接收参数,所以一般用类型推导=>
key := c.Query(“key”)
举个例子:
func main() {//Default返回一个默认的路由引擎r := gin.Default()r.GET("/user/search", func(c *gin.Context) {username := c.DefaultQuery("username", "小王子")//username := c.Query("username")address := c.Query("address")//输出json结果给调用方c.JSON(http.StatusOK, gin.H{"message": "ok","username": username,"address": address,})})r.Run()}
2. 获取form参数
当前端请求的数据通过form表单提交时,我们将该参数称作 form 参数,通常与**POST请求**相配。<br />获取form参数也有两个方法,c.DefaultPostForm 和 c.PostForm 前者有默认值、后者无默认值。
func main() {//Default返回一个默认的路由引擎r := gin.Default()r.POST("/user/search", func(c *gin.Context) {// DefaultPostForm取不到值时会返回指定的默认值username := c.DefaultPostForm("username", "小王子")// username := c.PostForm("username")address := c.PostForm("address")//输出json结果给调用方c.JSON(http.StatusOK, gin.H{"message": "ok","username": username,"address": address,})})r.Run(":8080")}
上述代码测试结果:<br />
3. 获取JSON参数
当前端请求的数据通过JSON提交时,我将该参数称作 JSON 参数,通常与POST请求相配。另外,JSON参数是与前端交互中使用的最多的参数格式。JSON格式的数据一般是一个map,原生来讲,用 GetRawData() 来接收,会返回一个data和一个error。
但是data是一条原生数据,我们看不懂,需要通过 json.Unmarshall (data, &m) 来反序列化,其中m为一个 map[string]interface{ } 型的map。发序列化之后,map就存储着json发来的数据:
func main() {//Default返回一个默认的路由引擎r := gin.Default()r.POST("/user/search", func(c *gin.Context) {data,err := c.GetRawData()var m map[string]interface{}_ = json.Unmarshal(data,&m)//输出json结果c.JSON(http.StatusOK, gin.H{"data": m,"err": err,})})r.Run(":8080")}
测试结果:<br /><br />不过一般不这样做,而是用后面将会介绍的,强大的 c.ShouldBind 方法
4. 获取URL参数
用于直接接收 URL 路径中包含的参数,如:/user/search/狗/阿拉斯加。由于不需要手动传参,所以通常与GET请求 相配。
在GET请求的URL里,需要用到的 字段key 前要用冒号 ‘ : ‘ 标注,可以标多个,但每个 /…/ 之间只能标一个。
使用的方法为:c.Param(“key”),也需要实例来接收
举个例子:
func main() {//Default返回一个默认的路由引擎r := gin.Default()r.GET("/user/search/:username/:address", func(c *gin.Context) {username:= c.Param("username")address:= c.Param("address")//输出json结果c.JSON(http.StatusOK, gin.H{"username": username,"address": address,})})r.Run(":8080")}
测试结果:
5. 参数绑定与ShouldBind
为了能够更方便的获取请求中的相关参数,提高开发效率,我们可以基于 c.ShouldBind 识别请求的数据类型并利用反射机制自动提取请求中 QueryString、form表单、JSON、XML 等参数到 结构体 中。下面的示例代码将演示 c.ShouldBind(&…) 的强大功能,它能够基于请求 自动提取 JSON、form表单 和 QueryString 类型的数据,并把值绑定到指定的 结构体对象 中。
func main() {router := gin.Default()// 绑定JSON的示例 ({"user": "q1mi", "password": "123456"})router.POST("/loginJSON", func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"login":login,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 绑定form表单示例 (user=q1mi&password=123456)router.POST("/loginForm", func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"login":login,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 绑定QueryString示例 (/loginQuery?user=q1mi&password=123456)router.GET("/loginQuery", func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"login":login,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// Listen and serve on 0.0.0.0:8080router.Run(":8080")}
JSON测试:<br /><br />form表单测试:<br /><br />QueryString测试:<br /><br />因此只要遇到参数获取,不过是什么格式,第一时间就应该想到 c.ShouldBind(&struct) 方法。
