前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Gin 实战(六)| 获取Form表单参数和原理分析

Golang Gin 实战(六)| 获取Form表单参数和原理分析

作者头像
飞雪无情
发布2020-01-23 20:47:15
5.3K0
发布2020-01-23 20:47:15
举报

除了通过URL查询参数提交数据到服务器外,常用的还有通过Form表单的方式。Form表单相比URL查询参数,用户体验好,可以承载更多的数据,尤其是文件上传,所以也更为方便。

Form 表单

对于Form表单,我们不会陌生,比如input文本框、密码框等等,可以让我们输入一些数据,然后点击「保存」、「提交」等按钮,把数据提交到服务器的。

对于Form表单来说,有两种提交方式GETPOST。其中GET方式就是我们前两篇文章的URL查询参数的方式,参考即可获得对应的参数键值对,这篇文章主要介绍POST的方式的表单,而Gin处理的也是这种表单。

Gin 接收表单数据

Gin 对于表单数据的获取也非常简单,为我们提供了和获取URL查询参数一样的系列方法。

1 2 3 4 5 6 7 8 9

func main() { r := gin.Default() r.POST("/", func(c *gin.Context) { wechat := c.PostForm("wechat") c.String(200, wechat) }) r.Run(":8080") }

运行这段代码,然后打开终端输入curl -d wechat=flysnow_org http://localhost:8080/ 回车,就会看到打印的如下信息:

代码语言:javascript
复制
flysnow_org

这里我们通过curl这个工具来模拟POST请求,当然你可以可以使用Postman比较容易操作的可视化工具。

在这个Gin示例中,使用PostForm方法来获取相应的键值对,它接收一个key,也就是我们htmlinput这类表单标签的name属性值。

PostForm方法和查询参数的Query是一样的,如果对应的key不存在则返回空字符串。

Gin PostForm系列方法

和查询参数方法一样,对于表单的参数接收,Gin也提供了一系列的方法,他们的用法和查询参数的一样。

查询参数

Form表单

说明

Query

PostForm

获取key对应的值,不存在为空字符串

GetQuery

GetPostForm

多返回一个key是否存在的结果

QueryArray

PostFormArray

获取key对应的数组,不存在返回一个空数组

GetQueryArray

GetPostFormArray

多返回一个key是否存在的结果

QueryMap

PostFormMap

获取key对应的map,不存在返回空map

GetQueryMap

GetPostFormMap

多返回一个key是否存在的结果

DefaultQuery

DefaultPostForm

key不存在的话,可以指定返回的默认值

通过这个表格以及对应和说明,可以更好记一些。

实现原理

关于PostForm系列方法的实现原理和Query系列类似,并且遵循Query-GetQuery-GetQueryArray这么一个内部调用顺序,所以我们直接看GetPostFormArray的源代码即可。

1 2 3 4 5 6 7

func (c *Context) GetPostFormArray(key string) ([]string, bool) { c.getFormCache() if values := c.formCachekey; len(values) > 0 { return values, true } return []string{}, false }

这里关键点在于getFormCache缓存Form表单的数据,接下来就是根据key获取对应的值了。

1 2 3 4 5 6 7 8 9 10 11 12

func (c *Context) getFormCache() { if c.formCache == nil { c.formCache = make(url.Values) req := c.Request if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { if err != http.ErrNotMultipart { debugPrint("error on parse multipart form array: %v", err) } } c.formCache = req.PostForm } }

从以上实现代码可以看到,formCache表单缓存其实也是一个url.Values,通过调用http.RequestParseMultipartForm对提交的表单解析,获得里面的数据保存在http.RequestPostForm字段中,最后从req.PostForm获取表单数据,赋值给c.formCache表单缓存即可。

这里需要注意的是保存表单缓存的内存大小,Gin默认给的是32M,通过const defaultMultipartMemory = 32 << 20 // 32 MB可以看出。

如果你觉得不够,可以提前通过修改MaxMultipartMemory的值增加,比如:

1 2

r := gin.Default() r.MaxMultipartMemory = 100 << 20

最后的GetPostFormMap方法,其实现原理和GetQueryMap一模一样,这里不再赘述,大家可以看下源代码。

小结

不管是查询参数还是表单提交,Gin都为我们做了很好的封装,并且通过缓存提升性能,让我们不再去关注这些具体的细节,可以专注于我们的业务实现,这也是框架的魅力所在。

所以,在我们日常的开发中,不管你是做什么业务,什么语言,还是要尽可能的复用、性能提升等,这样才能逐步的成长。

精彩文章推荐

Golang Gin 实战(五)| 接收数组和map

Golang Gin 实战(四)| URL查询参数的获取和原理分析

Golang Gin 实战(三)| 路由参数

Golang Gin 实战(二)| 简便的Restful API 实现

Golang Gin 实战(一)| 快速安装入门

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年12月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Form 表单
  • Gin 接收表单数据
  • Gin PostForm系列方法
  • 实现原理
  • 小结
  • 精彩文章推荐
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档