功能说明
LimitBody 是一个标准 func(http.Handler) http.Handler 中间件,用 http.MaxBytesReader 给请求体加上硬上限。读取超过限制时,json.Decoder 会返回 *http.MaxBytesError,处理器通过 errors.As 识别并返回 413;普通 JSON 错误返回 400,缺少 name 返回 422。示例用 httptest 直接驱动处理器,无需启动服务器。
关键代码
type Middleware func(http.Handler) http.Handler
func LimitBody(maxBytes int64) Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r.Body = http.MaxBytesReader(w, r.Body, maxBytes)
next.ServeHTTP(w, r)
})
}
}
MaxBytesReader 在超限时还会提示服务器关闭连接,避免客户端继续发送剩余数据。
使用注意
- 限制作用于原始字节,压缩请求体应先解压再限流,否则限制的是压缩后大小。
DisallowUnknownFields让拼错的字段直接报错,但会让 API 对新增字段更严格,需与版本策略配合。- 只调用一次
Decode不会检查请求体末尾是否还有多余 JSON,需要再调用一次并确认io.EOF。 - 中间件应放在认证之前或之后取决于业务:先限流可以更早拒绝大包。
- 413 响应后不宜再写业务数据,示例在错误分支直接返回。
验证方式
运行示例,第一条请求返回 201 和 created ada,第二条超长请求返回 413。把上限调到 10 字节可让正常请求也失败;删掉 name 字段可验证 422 分支。