Validate 中間件使用 proto-gen-validate 生成后的代碼進(jìn)行參數(shù)校驗(yàn),我們可以通過(guò)在 proto 中編寫(xiě)參數(shù)校驗(yàn)規(guī)則,然后生成代碼,通過(guò)中間件自動(dòng)的進(jìn)行校驗(yàn)。
在使用 validate 之前首先需要安裝 proto-gen-validate。
go install github.com/envoyproxy/protoc-gen-validate@latest
如果使用中遇到無(wú)法使用或者生成的代碼中 包含 ?// no validation rules for xxxx
?
可以嘗試 ?git clone github.com/envoyproxy/protoc-gen-validate
? 然后 ?make build
?
下面為大家列舉幾種常用類型的參數(shù)校驗(yàn)示例,更多的示例可以在 proto-gen-validate 文檔中查看。
// 參數(shù)必須大于 0
int64 id = 1 [(validate.rules).int64 = {gt: 0}];
// 參數(shù)必須在 0 到 120 之間
int32 age = 2 [(validate.rules).int64 = {gt:0, lte: 120}];
// 參數(shù)是 1 或 2 或 3
uint32 code = 3 [(validate.rules).uint32 = {in: [1,2,3]}];
// 參數(shù)不能是 0 或 99.99
float score = 1 [(validate.rules).float = {not_in: [0, 99.99]}];
// 參數(shù)必須為 true
bool state = 5 [(validate.rules).bool.const = true];
// 參數(shù)必須為 false
bool state = 5 [(validate.rules).bool.const = false];
// 參數(shù)必須為 /hello
string path = 6 [(validate.rules).string.const = "/hello"];
// 參數(shù)文本長(zhǎng)度必須為 11
string phone = 7 [(validate.rules).string.len = 11];
// 參數(shù)文本長(zhǎng)度不能小于 10 個(gè)字符
string explain = 8 [(validate.rules).string.min_len = 10];
// 參數(shù)文本長(zhǎng)度不能小于 1 個(gè)字符并且不能大于 10 個(gè)字符
string name = 9 [(validate.rules).string = {min_len: 1, max_len: 10}];
// 參數(shù)文本使用正則匹配,匹配必須是非空的不區(qū)分大小寫(xiě)的十六進(jìn)制字符串
string card = 10 [(validate.rules).string.pattern = "(?i)^[0-9a-f]+$"];
// 參數(shù)文本必須是 email 格式
string email = 11 [(validate.rules).string.email = true];
// 參數(shù)為必填項(xiàng)
Info info = 11 [(validate.rules).message.required = true];
message Info {
string address = 1;
}
1.直接使用?protoc
?生成
protoc --proto_path=. \
--proto_path=./third_party \
--go_out=paths=source_relative:. \
--validate_out=paths=source_relative,lang=go:. \
xxxx.proto
2.在Makefile中添加?validate
?命令
.PHONY: validate
# generate validate proto
validate:
protoc --proto_path=. \
--proto_path=./third_party \
--go_out=paths=source_relative:. \
--validate_out=paths=source_relative,lang=go:. \
$(API_PROTO_FILES)
3.執(zhí)行命令
make validate
我們可以將 validate 中間件注入到 http 或者 grpc 中,在有請(qǐng)求進(jìn)入時(shí) validate 中間件會(huì)自動(dòng)對(duì)參數(shù)根據(jù) proto 中編寫(xiě)的規(guī)則進(jìn)行校驗(yàn)。
httpSrv := http.NewServer(
http.Address(":8000"),
http.Middleware(
validate.Validator(),
))
grpcSrv := grpc.NewServer(
grpc.Address(":9000"),
grpc.Middleware(
validate.Validator(),
))
更多建議: