Skip to content

请求参数验证 ​

核心框架通过 server_api/pkg/validate 统一处理 JSON、Query 和 URI 参数。管理端、用户端及插件 Controller 均使用相同入口,参数错误返回业务码 400 和字段级中文提示。

标签约定 ​

go
type MemberSetStatusReq struct {
    ID     uint `json:"id" binding:"required" validate:"用户ID" comment:"用户ID"`
    Status int  `json:"status" binding:"required,oneof=1 2" validate:"目标状态" comment:"目标状态:1启用,2禁用"`
}
标签说明
json / form / uri请求字段名称
bindingrequired、oneof、min、max、email、url 等验证规则
validate面向用户的字段语义,例如“用户ID”“目标状态”
comment完整字段说明,可包含枚举值和补充规则

validate 从 comment 提取简洁的核心名称,不应写成完整错误句子。所有请求字段都需要该标签,即使字段当前没有 binding 规则。

Controller 使用 ​

JSON 请求体和 GET 查询参数统一使用 Bind:

go
if err := requestvalidate.Bind(c, &req); err != nil {
    response.Fail(c, response.CodeErrParams, err.Error())
    return
}

URI 参数使用 BindURI。已经完成赋值的结构体可以使用 validate.Struct(&req) 再次校验。Controller 不应直接调用 Gin ShouldBind*,也不应使用“参数错误”覆盖验证器生成的语义化提示。

错误信息 ​

规则返回示例
required登录账号不能为空
oneof=1 2目标状态取值不正确
len=6短信验证码长度必须为6
字符串 min=6新密码长度不能少于6个字符
字符串 max=32昵称长度不能超过32个字符
数组 min/max日志ID列表至少包含1项 / 最多包含500项
email / url邮箱格式不正确 / 插件主页地址必须是有效的URL地址

JSON 语法错误返回“请求参数格式错误”;JSON 类型不匹配时尽量返回对应字段“格式不正确”。为保持响应简洁,系统只返回第一条验证错误。

自定义规则 ​

RegisterValidation 注册字段级规则,RegisterStructValidation 注册跨字段规则。注册必须发生在服务启动阶段、开始并发处理请求之前。规则仍写在 binding 中,字段文案仍由 validate 决定。

唯一性、数据库状态、登录用户权限等依赖外部状态的判断属于业务校验,应继续放在 Logic 层,不能塞进字段验证器。