除了通过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

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

精彩文章推荐