基础
Go Web 的表单类型有三种:
r.Form
r.PostForm
r.MultipartForm
PostForm 支持 form-data 和 x-www-form-urlencoded 两种请求体,但是不支持上传文件。
MultipartForm 只支持 form-data 请求体,但是支持上传文件。
Form 包含了 URL Query 和 PostForm 两者的集合。
解析方式有两种:
r.ParseForm()
r.ParseMultipartForm(1 << 20) // 1<<20的值自行设置
当执行 ParseForm() 时,会同时解析 PostForm。
ParseForm->Form->PostForm
当执行 ParseMultipartForm() 时,会同时执行 ParseForm。
ParseMultipartForm->MultipartForm->Form->PostForm
form-data

ParseForm()
下面来测试 r.ParseForm()。
测试代码:
r.ParseForm()
fmt.Println(r.Form)
fmt.Println(r.PostForm)
fmt.Println(r.MultipartForm)

除了能够接收 URL Query,PostForm、MultipartForm 都没有数据。
ParseMultipartForm()
下面来测试 r.ParseMultipartForm()。
r.ParseMultipartForm(1 << 20)
fmt.Println(r.Form)
fmt.Println(r.PostForm)
fmt.Println(r.MultipartForm)

可见,所有的表单都正常。
x-www-form-urlencoded

ParseForm()
下面来测试 r.ParseForm()。
测试代码:
r.ParseForm()
fmt.Println(r.Form)
fmt.Println(r.PostForm)
fmt.Println(r.MultipartForm)

可以看到,Form,PostForm 都是正常的,MultipartForm 没有数据。
ParseMultipartForm()
下面来测试 r.ParseMultipartForm()。
r.ParseMultipartForm(1 << 20)
fmt.Println(r.Form)
fmt.Println(r.PostForm)
fmt.Println(r.MultipartForm)

可以看到,Form,PostForm 都是正常的,MultipartForm 没有数据。
如何使用
由于 x-www-form-urlencoded 性能比 form-data 高一些,所以如何不需要上传文件中,则这样搭配:
content-type: x-www-form-urlencoded
r.ParseForm()
fmt.Println(r.PostForm)
如果需要上传文件,则这样搭配:
content-type: form-data
r.ParseMultipartForm(1 << 20)
fmt.Println(r.MultipartForm)
文章评论
每天搞些小笔记