除了通过URL查询参数提交数据到服务器外,常用的还有通过Form表单的方式。Form表单相比URL查询参数,用户体验好,可以承载更多的数据,尤其是文件上传,所以也更为方便。
Form 表单
input
GETPOSTGETPOSTGin
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/
flysnow_org
curlPostman
GinPostFormkeyhtmlinputname
PostFormQuerykey
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不存在的话,可以指定返回的默认值  | 
通过这个表格以及对应和说明,可以更好记一些。
实现原理
PostFormQueryQuery-GetQuery-GetQueryArrayGetPostFormArray
1 2 3 4 5 6 7  | 
func (c *Context) GetPostFormArray(key string) ([]string, bool) { c.getFormCache() if values := c.formCache[key]; len(values) > 0 { return values, true } return []string{}, false }  | 
|---|
getFormCachekey
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 } }  | 
|---|
formCacheurl.Valueshttp.RequestParseMultipartFormhttp.RequestPostFormreq.PostFormc.formCache
Ginconst defaultMultipartMemory = 32 << 20 // 32 MB
MaxMultipartMemory
1 2  | 
r := gin.Default() r.MaxMultipartMemory = 100 << 20  | 
|---|
GetPostFormMapGetQueryMap
小结
Gin
所以,在我们日常的开发中,不管你是做什么业务,什么语言,还是要尽可能的复用、性能提升等,这样才能逐步的成长。
精彩文章推荐