参数校验

Validate 中间件使用 proto-gen-validate 生成后的代码进行参数校验,我们可以通过在 proto 中编写参数校验规则,然后生成代码,通过中间件自动的进行校验。

安装工具

在使用 validate 之前首先需要安装 proto-gen-validate

  1. go install github.com/envoyproxy/protoc-gen-validate@latest

如果使用中遇到无法使用或者生成的代码中 包含 // no validation rules for xxxx

可以尝试 git clone github.com/envoyproxy/protoc-gen-validate 然后 make build

规则示例

下面为大家列举几种常用类型的参数校验示例,更多的示例可以在 proto-gen-validate 文档中查看。

数字类型

  1. // 参数必须大于 0
  2. int64 id = 1 [(validate.rules).int64 = {gt: 0}];
  3. // 参数必须在 0 到 120 之间
  4. int32 age = 2 [(validate.rules).int64 = {gt:0, lte: 120}];
  5. // 参数是 1 或 2 或 3
  6. uint32 code = 3 [(validate.rules).uint32 = {in: [1,2,3]}];
  7. // 参数不能是 0 或 99.99
  8. float score = 1 [(validate.rules).float = {not_in: [0, 99.99]}];

布尔类型

  1. // 参数必须为 true
  2. bool state = 5 [(validate.rules).bool.const = true];
  3. // 参数必须为 false
  4. bool state = 5 [(validate.rules).bool.const = false];

文本类型

  1. // 参数必须为 /hello
  2. string path = 6 [(validate.rules).string.const = "/hello"];
  3. // 参数文本长度必须为 11
  4. string phone = 7 [(validate.rules).string.len = 11];
  5. // 参数文本长度不能小于 10 个字符
  6. string explain = 8 [(validate.rules).string.min_len = 10];
  7. // 参数文本长度不能小于 1 个字符并且不能大于 10 个字符
  8. string name = 9 [(validate.rules).string = {min_len: 1, max_len: 10}];
  9. // 参数文本使用正则匹配,匹配必须是非空的不区分大小写的十六进制字符串
  10. string card = 10 [(validate.rules).string.pattern = "(?i)^[0-9a-f]+$"];
  11. // 参数文本必须是 email 格式
  12. string email = 11 [(validate.rules).string.email = true];

消息体

  1. // 参数为必填项
  2. Info info = 11 [(validate.rules).message.required = true];
  3. message Info {
  4. string address = 1;
  5. }

生成代码

1.直接使用protoc生成

  1. protoc --proto_path=. \
  2. --proto_path=./third_party \
  3. --go_out=paths=source_relative:. \
  4. --validate_out=paths=source_relative,lang=go:. \
  5. xxxx.proto

2.在Makefile中添加validate命令

  1. .PHONY: validate
  2. # generate validate proto
  3. validate:
  4. protoc --proto_path=. \
  5. --proto_path=./third_party \
  6. --go_out=paths=source_relative:. \
  7. --validate_out=paths=source_relative,lang=go:. \
  8. $(API_PROTO_FILES)

执行命令

  1. make validate

搭配中间件使用

我们可以将 validate 中间件注入到 http 或者 grpc 中,在有请求进入时 validate 中间件会自动对参数根据 proto 中编写的规则进行校验。

http

  1. httpSrv := http.NewServer(
  2. http.Address(":8000"),
  3. http.Middleware(
  4. validate.Validator(),
  5. ))

grpc

  1. grpcSrv := grpc.NewServer(
  2. grpc.Address(":9000"),
  3. grpc.Middleware(
  4. validate.Validator(),
  5. ))

References