如何在Golang中接收JSON请求_HTTP服务器解析请求体

Go中解析JSON请求需设Content-Type头、用json.NewDecoder(r.Body).Decode(&u)反序列化,结构体字段须大写并用json标签映射,注意错误处理、大小限制与字段校验。

在 Go 中接收并解析 JSON 请求,核心是读取 HTTP 请求体、反序列化为 Go 结构体。关键点在于:正确设置请求头(Content-Type: application/json),使用 json.Decode(r.Body)json.Unmarshal,并做好错误处理和请求体读取控制。

确保客户端发送标准 JSON 请求

客户端需设置请求头,并发送合法 JSON 数据:

  • Content-Type: application/json 必须存在,否则服务端无法可靠识别
  • JSON 内容需格式正确(如双引号包裹键名、无尾逗号)
  • 例如 curl 示例:
    curl -X POST http://localhost:8080/api/user \\
    -H "Content-Type: application/json" \\
    -d '{"name":"Alice","age":30}'

定义结构体并绑定 JSON 字段

用结构体字段标签 json:"field_name" 明确映射关系,注意大小写与导出性:

  • 结构体字段必须首字母大写(可导出),否则 json 包无法访问
  • json:"name" 表示 JSON 中的 "name" 键映射到该字段
  • 可用 json:",omitempty" 忽略零值字段(如空字符串、0、nil 切片)
  • 示例:
    type User struct {
    Name string `json:"name"`
    Age int `json:"age"`
    Email string `json:"email,omitempty"`
    }

在 HTTP 处理函数中解析请求体

推荐使用 json.NewDecoder(r.Body).Decode(&v),它支持流式读取、内存友好且自动处理 EOF:

  • 不要先用 ioutil.ReadAll(Go 1.16+ 已弃用)或 io.ReadAll 读全部再解码,除非你需要多次读取或校验原始字节
  • 务必检查解码错误,常见错误包括:字段类型不匹配、JSON 格式错误、缺少必需字段(未设默认值)
  • 示例代码:
    func handleUser(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
    http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    return
    }

    var u User
    err := json.NewDecoder(r.Body).Decode(&u)
    if err != nil {
    http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)
    return
    }
    // 此时 u 已填充,可继续业务逻辑
    json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
    }

补充建议:验证与健壮性

生产环境建议增强容错能力:

  • 对关键字段做非空/范围校验(如 Age > 0),失败时返回明确错误
  • 限制请求体大小,防止恶意大 Payload(可用 r.Body = http.MaxBytesReader(w, r.Body, 1 限 1MB)
  • 若需同时支持表单和 JSON,应根据 r.Header.Get("Content-Type") 分支处理
  • 考虑用第三方库如 go-playground/validator 做结构体字段级校验