在 Web 应用开发中,表单是最常见的数据提交方式之一。无论是注册登录、评论发布,还是搜索功能,后台都需要从 HTTP 请求中解析出表单数据 。Go 的标准库
net/http
内置了表单解析功能,使用起来非常方便。
本文将带你用 Go 编写一个简单的表单解析服务,既支持 application/x-www-form-urlencoded
(普通表单),也支持 multipart/form-data
(文件上传表单)的解析。
一、目标说明
实现一个接口:
-
路径 :
/submit
-
方法 :
POST
-
功能:
- 接收并解析表单字段
username
和email
- 返回 JSON 格式的解析结果
- 接收并解析表单字段
二、核心知识点
r.ParseForm()
:解析 URL 编码表单(GET 和 POST 都可用)r.ParseMultipartForm(maxMemory)
:解析multipart/form-data
表单(支持文件上传)r.Form
:包含所有解析出的表单数据r.PostForm
:只包含 POST 提交的表单数据r.FormValue("key")
:快捷获取单个字段值(自动调用ParseForm
)
三、完整代码示例
go
package main
import (
"encoding/json"
"net/http"
)
type Response struct {
Username string `json:"username"`
Email string `json:"email"`
}
func submitHandler(w http.ResponseWriter, r *http.Request) {
// 只允许 POST 请求
if r.Method != http.MethodPost {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
// 解析表单数据(支持 application/x-www-form-urlencoded 和 multipart/form-data)
err := r.ParseForm()
if err != nil {
http.Error(w, "Failed to parse form: "+err.Error(), http.StatusBadRequest)
return
}
// 获取表单字段
username := r.FormValue("username")
email := r.FormValue("email")
// 构造响应
resp := Response{
Username: username,
Email: email,
}
// 返回 JSON
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(resp)
}
func main() {
http.HandleFunc("/submit", submitHandler)
http.ListenAndServe(":8080", nil)
}
四、测试方式
1. 使用 curl
测试
bash
curl -X POST http://localhost:8080/submit \
-d "username=Tom&email=tom@example.com"
返回结果:
json
{
"username": "Tom",
"email": "tom@example.com"
}
2. HTML 表单测试
html
<form action="http://localhost:8080/submit" method="POST">
<input type="text" name="username" placeholder="输入用户名">
<input type="email" name="email" placeholder="输入邮箱">
<button type="submit">提交</button>
</form>
五、注意事项
-
ParseForm()
必须调用r.FormValue()
会自动调用ParseForm()
,但如果你直接访问r.Form
,必须手动调用。
-
multipart/form-data(文件上传表单)
- 上传文件时需要用
r.ParseMultipartForm(maxMemory)
,并用r.FormFile("file")
获取文件。
- 上传文件时需要用
-
获取多个值
r.Form["key"]
返回[]string
,适用于复选框等多值字段。
六、进阶扩展
- 支持文件上传
- 添加表单字段校验
- 将数据存储到数据库
- 与 JSON 数据解析结合,支持多种输入格式
七、总结
通过本案例,你掌握了 Go 原生的表单解析方法:
✅ 支持多种表单类型(URL 编码、Multipart) ✅ 可用 FormValue()
快速获取字段值 ✅ 与 JSON 编解码结合,轻松返回结构化数据