Scert/backend/internal/httpapi/json.go

33 lines
762 B
Go

package httpapi
import (
"encoding/json"
"errors"
"io"
"net/http"
"github.com/gin-gonic/gin"
)
// bindJSON 严格解析 JSON 请求,并拒绝未知字段和多段 JSON。
func bindJSON(c *gin.Context, target any, limit int64) error {
if c == nil || c.Request == nil || c.Request.Body == nil {
return errors.New("请求上下文或请求体为空")
}
if limit > 0 {
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, limit)
}
decoder := json.NewDecoder(c.Request.Body)
decoder.DisallowUnknownFields()
if err := decoder.Decode(target); err != nil {
return err
}
if err := decoder.Decode(&struct{}{}); err != io.EOF {
if err == nil {
return errors.New("请求体包含多段 JSON 数据")
}
return err
}
return nil
}