目录
- 前言
- 正文
- Query 参数解析
- Multipart/Urlencoded Form 参数解析
- query + post form 参数解析
- Map 参数解析
- 结尾
前言
Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。今天,我们就来详细看看 Gin 是如何进行参数解析的。
正文
Query 参数解析
在所有的请求中,Query 参数属于最常见的一种,下面通过一段代码来看一下,代码如下:
package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.GET("/welcome", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") lastname := c.Query("lastname") c.String(http.StatusOK, "Hello %s %s", firstname, lastname) }) router.Run(":8080") }
上述 API 接口能够匹配类似如下请求的 URL:
/welcome?firstname=Jane&lastname=Doe
上述 Get 请求中,如果 Query 部分缺少参数 firstname,那么 firstname 的值将赋值为“Guest”;但是,如果缺少参数 lastname,那么 lastname 的值为空。
Multipart/Urlencoded Form 参数解析
在所有的请求中,还有 Multipart/Urlencoded Form 类型的参数,下面通过一段代码来理解一下,代码如下:
package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{ "status": "posted", "message": message, "nick": nick, }) }) router.Run(":8080") }
上述 Post 请求中,如果 Body 部分缺少参数 nick,那么 nick 的值将赋值为“anonymous”;但是,如果缺少参数 message,那么 message 的值为空。
query + post form 参数解析
有些请求可能同时含有 query 参数和 post form 参数,比如:
POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
name=manu&message=this_is_great
代码实例:
package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.POST("/post", func(c *gin.Context) { id := c.Query("id") page := c.DefaultQuery("page", "0") name := c.PostForm("name") message := c.PostForm("message") fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) }) router.Run(":8080") }
由上面的例子可以看出,解析 Query 类型的参数时,使用的是 Query 方法和 DefaultQuery 方法;解析 post form 类型的参数时,使用的是 PostForm 方法。
Map 参数解析
请求参数中还有一种类型就是 Map 类型,请求实例如下:
POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1
Content-Type: application/x-www-form-urlencoded
names[first]=thinkerou&names[second]=tianou
这种情况该如何解析呢?请看如下代码:
func main() { router := gin.Default() router.POST("/post", func(c *gin.Context) { ids := c.QueryMap("ids") names := c.PostFormMap("names") fmt.Printf("ids: %v; names: %v", ids, names) }) router.Run(":8080") }
打印结果如下:
ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou]
结尾
好啦,今天介绍了如何利用 Gin 框架解析四种不同参数请求的方法。希望对大家如何熟练使用 Gin 框架有所帮助。
作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,同时也是CSDN博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!