Go语言中如何验证HTTP POST请求,拒绝含额外属性的请求?
解决Go中JSON解码时拒绝未知字段的问题
要拒绝包含结构体定义外额外属性的HTTP POST请求,只需给json.Decoder添加DisallowUnknownFields()配置,这样解码遇到未定义字段时就会直接返回错误。
修改后的代码示例
type RestPermissionDataV2 struct { // required:true Method string `json:"method" validate:"required"` // required:true Path string `json:"path" validate:"required"` } var permData RestPermissionDataV2 dec := json.NewDecoder(r.Body) // 关键配置:拒绝未知字段 dec.DisallowUnknownFields() if err := dec.Decode(&permData); err != nil { // 返回错误,比如400 Bad Request http.Error(w, "请求包含无效字段: "+err.Error(), http.StatusBadRequest) return } // 继续执行原有必填字段的验证 validate := validator.New() if err := validate.Struct(permData); err != nil { http.Error(w, "字段验证失败: "+err.Error(), http.StatusBadRequest) return }
原理说明
- 默认情况下,Go的
json.Decoder会忽略结构体中未定义的JSON字段,不会触发错误。 DisallowUnknownFields()方法会改变这个行为,当解码时遇到结构体没有对应字段的JSON键值对,就会返回json: unknown field "a"这类错误,此时你可以直接返回HTTP 400错误给客户端。
内容的提问来源于stack exchange,提问作者Saurabh Batra
相关产品推荐
相关产品推荐

