🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
构建验证器主要整合了`JSON`解析和用户请求参数的验证封装在`requests`目录下,理论上每个`控制器`都需要对应一个`验证器`来实现安全的参数读取。 **任何时候都不能相信用户发送过来的请求。** 这个 Web 开发的黄金法则。 ## Govalidator 验证规则纷繁复杂,没必要去从零开始写一个验证器。Go 社区已经有很多现成的方案可供选择。 系统将选用[github.com/thedevsaddam/govalidato...](https://github.com/thedevsaddam/govalidator)来作为请求验证的基础包。它除了拥有丰富的验证规则外,还支持自定义规则和自定义错误消息,满足我们的需求。 ## 验证器 一个简单的查询用户列表的验证器如下: ``` package requests import ( "github.com/gin-gonic/gin" "github.com/thedevsaddam/govalidator" ) // 请求参数 type PaginationRequest struct { Sort string `valid:"sort" form:"sort"` Order string `valid:"order" form:"order"` PerPage string `valid:"per_page" form:"per_page"` } func Pagination(data interface{}, c *gin.Context) map[string][]string { rules := govalidator.MapData{ "sort": []string{"in:id,created_at,updated_at"}, "order": []string{"in:asc,desc"}, "per_page": []string{"numeric_between:2,100"}, } messages := govalidator.MapData{ "sort": []string{ "in:排序字段仅支持 id,created_at,updated_at", }, "order": []string{ "in:排序规则仅支持 asc(正序),desc(倒序)", }, "per_page": []string{ "numeric_between:每页条数的值介于 2~100 之间", }, } return validate(data, rules, messages) } ``` 在控制器中使用它也是非常简单的: ``` // Index 查询Users列表(分页) func (this *UsersController) Index(c *gin.Context) { // 验证请求参数 request := requests.PaginationRequest{} if ok := requests.Validate(c, &request, requests.Pagination); !ok { // 验证失败 return } response.ShowSuccess(c, "操作成功!") } ``` 可以看到我们这里是直接用验证器接受了用户请求参数并绑定到`struct`对象。