前言
上篇介绍了go-grpc-middleware的grpc_zap
、grpc_auth
和grpc_recovery
使用,本篇将介绍grpc_validator
,它可以对gRPC数据的输入和输出进行验证。
创建proto文件,添加验证规则
这里使用第三方插件go-proto-validators自动生成验证规则。
go get github.com/mwitkow/go-proto-validators
1.新建simple.proto文件
1 | syntax = "proto3"; |
代码import "github.com/mwitkow/go-proto-validators/validator.proto"
,文件validator.proto
需要import "google/protobuf/descriptor.proto";
包,不然会报错。
google/protobuf
地址:https://github.com/protocolbuffers/protobuf/tree/master/src/google/protobuf/descriptor.proto
把src
文件夹中的protobuf
目录下载到GOPATH目录下。
2.编译simple.proto文件
go get github.com/mwitkow/go-proto-validators/protoc-gen-govalidators
指令编译:protoc --govalidators_out=. --go_out=plugins=grpc:./ ./simple.proto
或者使用
VSCode-proto3
插件,第一篇有介绍。只需要添加"--govalidators_out=."
即可。
1 | // vscode-proto3插件配置 |
编译完成后,自动生成simple.pb.go
和simple.validator.pb.go
文件,simple.pb.go
文件不再介绍,我们看下simple.validator.pb.go
文件。
1 | // Code generated by protoc-gen-gogo. DO NOT EDIT. |
里面自动生成了message
中属性的验证规则。
把grpc_validator
验证拦截器添加到服务端
1 | grpcServer := grpc.NewServer(cred.TLSInterceptor(), |
运行后,当输入数据验证失败后,会有以下错误返回
1 | Call Route err: rpc error: code = InvalidArgument desc = invalid field SomeInteger: value '101' must be less than '100' |
其他类型验证规则设置
enum
验证
1 | syntax = "proto3"; |
UUID
验证
1 | syntax = "proto3"; |
总结
go-grpc-middleware
中grpc_validator
集成go-proto-validators
,我们只需要在编写proto时设好验证规则,并把grpc_validator
添加到gRPC服务端,就能完成gRPC的数据验证,很简单也很方便。