Kratos 參數(shù)校驗(yàn)

2022-04-25 10:01 更新

參數(shù)校驗(yàn)

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?

規(guī)則示例

下面為大家列舉幾種常用類型的參數(shù)校驗(yàn)示例,更多的示例可以在 proto-gen-validate 文檔中查看。

數(shù)字類型

// 參數(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)。

http

httpSrv := http.NewServer(
    http.Address(":8000"),
    http.Middleware(
        validate.Validator(),
    ))

grpc

grpcSrv := grpc.NewServer(
    grpc.Address(":9000"),
    grpc.Middleware(
        validate.Validator(),
    ))


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)