构建验证器主要整合了`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`对象。
- 序言
- 基础
- 安装GoHub
- 目录结构
- 开发规范
- 部署项目
- 架构
- 架构总览
- 生命周期
- 配置
- 配置介绍
- 配置目录
- 配置格式
- 配置加载
- 读取配置
- 动态配置
- 环境变量配置
- 路由
- 路由模式
- 路由定义
- 路由参数
- 路由分组
- 路由限流
- 路由拆分
- 控制器
- 控制定义
- 控制器初始化
- 中间件
- Make创建控制器
- 请求
- 请求信息
- 数据库
- 连接数据库
- 基本使用
- Make创建模型
- 日志
- 介绍
- 日志驱动
- 日志写入
- HTTP日志
- 数据库请求日志
- 错误和调试
- Debuger调试器
- 验证
- 验证器
- 验证规则
- Make创建验证器
- 杂项
- 缓存
- 分页
- 验证码
- CURL请求
- 命令行
- 基础知识
- console 包
- Cobra 基础
- 命令行模式
- 附录
- 配置参考
- 第三方依赖库