Golang Gin 框架参数解析介绍(三)

举报
liuzhen007 发表于 2021/11/21 23:06:30 2021/11/21
【摘要】 ​ 目录前言正文Query 参数解析Multipart/Urlencoded Form 参数解析query + post form 参数解析Map 参数解析结尾前言Gin 是使用纯 Golang 语言实现的 HTTP Web 框架,Gin 的接口设计简洁,性能极高,现在被广泛使用。今天,我们就来详细看看 Gin 是如何进行参数解析的。正文Query 参数解析在所有的请求中,Query 参数属...

 目录

  • 前言

  • 正文

    • 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 框架有所帮助。



作者简介:大家好,我是 liuzhen007(Data-Mining),是一位音视频技术爱好者,同时也是CSDN博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。