Go Web 的表单类型笔记

2022年5月29日 1872点热度 1人点赞 1条评论
内容纲要

基础

Go Web 的表单类型有三种:

    r.Form
    r.PostForm
    r.MultipartForm

PostForm 支持 form-datax-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

file

ParseForm()

下面来测试 r.ParseForm()

测试代码:

    r.ParseForm()
    fmt.Println(r.Form)
    fmt.Println(r.PostForm)
    fmt.Println(r.MultipartForm)

file

除了能够接收 URL Query,PostFormMultipartForm 都没有数据。

ParseMultipartForm()

下面来测试 r.ParseMultipartForm()

    r.ParseMultipartForm(1 << 20)
    fmt.Println(r.Form)
    fmt.Println(r.PostForm)
    fmt.Println(r.MultipartForm)

file

可见,所有的表单都正常。

x-www-form-urlencoded

file

ParseForm()

下面来测试 r.ParseForm()

测试代码:

    r.ParseForm()
    fmt.Println(r.Form)
    fmt.Println(r.PostForm)
    fmt.Println(r.MultipartForm)

file

可以看到,FormPostForm 都是正常的,MultipartForm 没有数据。

ParseMultipartForm()

下面来测试 r.ParseMultipartForm()

    r.ParseMultipartForm(1 << 20)
    fmt.Println(r.Form)
    fmt.Println(r.PostForm)
    fmt.Println(r.MultipartForm)

file

可以看到,FormPostForm 都是正常的,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)

痴者工良

高级程序员劝退师

文章评论

  • 痴者工良

    每天搞些小笔记

    2022年5月29日