2026-10-24 19:16:08
在Go语言中处理HTTP请求Body时,核心流程包括安全读取原始数据、根据格式反序列化到结构体以及输入验证。以下是典型场景的代码示例和关键注意事项:
一、读取请求Body原始数据Body是io.ReadCloser类型,只能读取一次,需通过io.ReadAll获取字节流,并使用defer关闭Body防止内存泄漏。
func handler(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "仅支持POST方法", http.StatusMethodNotAllowed) return } body, err := io.ReadAll(r.Body) if err != nil { http.Error(w, "读取Body失败", http.StatusBadRequest) return } defer r.Body.Close() // 必须关闭 fmt.Printf("接收到的数据: %sn", body)}二、JSON数据绑定到结构体使用encoding/json库反序列化,需定义带json标签的结构体,并通过json.NewDecoder解析。
通过r.ParseForm()解析表单,用r.FormValue()获取字段值,注意类型转换。
func handleForm(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { http.Error(w, "解析表单失败", http.StatusBadRequest) return } age, err := strconv.Atoi(r.FormValue("age")) // 字符串转int if err != nil { http.Error(w, "年龄格式错误", http.StatusBadRequest) return } user := User{ Name: r.FormValue("name"), Email: r.FormValue("email"), Age: age, } fmt.Printf("表单用户: %+vn", user)}2. 高级方式:使用第三方库github.com/gorilla/schema支持自动类型转换和嵌套结构体绑定。
Content-Type验证:
JSON请求需检查Content-Type: application/json。
表单请求需检查Content-Type: application/x-www-form-urlencoded。
错误处理:
覆盖解析失败、字段缺失、类型错误等场景。
示例:检查JSON字段是否存在。
资源释放:
必须调用defer r.Body.Close()避免文件描述符泄漏。
边界限制:
限制Body大小(如r.Body = http.MaxBytesReader(w, r.Body, 1e6))。
验证字段长度(如邮箱格式、年龄范围)。
通过以上方法,可高效完成HTTP请求Body的解析与数据绑定,同时确保代码的健壮性和安全性。