← 中文资源

简体中文版本

限制请求体的 HTTP 中间件

用 MaxBytesReader 给请求体加硬上限,解析时识别 MaxBytesError 并返回 413,中间件可包在任意处理器外层复用。

阅读英文原文

功能说明

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 分支。