protobuf 验证器

xuesongtao · · 2293 次点击    
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
# proto 中注入 tag, 验证 #### 1. 介绍 - 1. 对 `xxx.pd.go` 文件中的 `struct` 注入自定义的 `tag` - 2. 通过验证器对内容进行验证, 验证器暂只支持: 必填, 长度, 多个一个必填 #### 2. 注入工具使用 - 1. 先下载本项目: `go get -u gitee.com/xuesongtao/protoc-go-valid` - 2. `protoc-go-valid` 命令操作, 如下: - 2.1 `protoc-go-valid -init="true"` - 2.1 `protoc-go-valid -d="待注入的目录"` - 2.2 `protoc-go-valid -p="匹配模式"` - 2.3 `protoc-go-valid -f="单个待注入的文件"` - 3. 参考 `protoc-go-inject-tag` #### 3. 工具补充 - 1. `protoc-go-valid -h` 可以通过这个查看帮助 - 2. 由于此操作是先执行 `protoc` 才再进行注入(需先按照 `protoc`), 项目中的 `inject_tool.sh` 整合了这两步操作, 可以执行 `protoc-go-valid -init="true"`, **说明:** 如果为 **windows** 需要使用 `powershell` 来执行 - 3. 根据自己的项目目录结构调整 `inject_tool.sh` 中 `proto` 和 `pb` 的目录, 相对于应用的目录; 如本项目, 修改如下下: ``` outPdProjectPath="test" # pb 放入的项目路径 protoFileDirName="test" # proto 存放的目录 ``` #### 4. 验证器 ##### 4.1 验证 Struct ###### 4.1.1 支持的验证如下: | 标识 | 说明 | | -------- | ------------------------------------------------------------------------------------------------------------------------- | | required | 必填标识, 支持嵌套验证(结构体和结构体切片) | | either | 多选一, 即多个中必须有一个必填, 格式为 "either=xxx"(通过数据进行标识) | | to | 闭区间验证, 采用 `左右闭区间`, 格式为 "to=xxx\~xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小), 如: "to=1\~10" | | ge | 大于或等于验证, 格式为 "ge=xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小) | | le | 小于或等于验证, 格式为: "le=xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小) | | oto | 开区间验证, 采用 `左右开区间`, 格式为 "oto=xxx\~xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小), 如: "oto=1\~10" | | gt | 大于验证, 格式为 "gt=xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小) | | lt | 小于验证, 格式为: "lt=xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小) | | eq | 等于验证, 格式为: "eq=xxx"(字段类型: 字符串则为长度, 字段类型: 数字型则为大小) | in | 指定输入选项, 格式为 "in=(xxx/xxx/xxx)", 如: "in=(1/2/3)" | | phone | 手机号验证 | | email | 邮箱验证 | | idcard | 身份证号码验证 | | date | 日期验证, 格式为 "date=xxxx-xx-xx" | | datetime | 时间验证, 格式为 "datetime=xxxx-xx-xx xx:xx:xx" | | int | 整数型验证 | | float | 浮动数型验证 | ###### 4.1.2 设置验证 - 1. 通过设置 `tag` 进行设置验证规则, 默认目标 `tagName` 为 `valid` - 2. 通过创建 `RM` 对象进行设置, `RM` 暂不支持嵌套 - 其他: 默认按照 `tag` 进行处理, 如果设置 `RM` 对象会以此规则为准; 如果没有实现的, 可以调用 `SetCustomerValidFn` 自定义; 使用的可以参考 `example_test.go`, `valid_test.go` #### 5 使用示例: - `proto` 内容如下: ``` message Man { string name = 1; // 姓名 @tag valid:"required,to=1~3" int32 age = 2; // 年龄 @tag valid:"to=1~150" } ``` - **注:** 编写 `xxx.proto` 时, 需要加将 `@tag xxx` 放到注释的最后面 - 执行命令: `inject_tool.sh xxx.proto` 生成 `pd` 内容如下: ``` type Man struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty" valid:"required,to=1~3"` // 姓名 @tag valid:"required,to=1~3" Age int32 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty" valid:"to=1~150"` // 年龄 @tag valid:"to=1~150" } ``` - 代码里的使用 ``` m := &test.Man{ Name: "xue", Age: -1, } t.Log(ValidateStruct(m)) // 输出: "Man.Age" is size less than 1 ``` #### 最后 - 欢迎大佬们指正, 希望大佬给 **star**, [to gitee](https://gitee.com/xuesongtao/protoc-go-valid)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2293 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传