在java web开发的时候,我们所有的http请求几乎都会涉及到入参,那么对于入参的参数校验来说就相当重要了。在java中有validate框架的支持,我们仅需要使用注解即可完成参数校验。那么在go-kratos中是否也有这样的框架让我们简便的进行参数校验呢?其实是有的,他就是protoc-gen-validate(PGV)框架,他的开源地址是:protoc-gen-validate开源框架。
本文我们主要列举protoc-gen-validate这个参数校验框架的所有可用规则
约束规则 | 示例 |
必须是指定值 | [(validate.rules).float.const = 1.23 [(validate.rules).string.const = 1.23]] [(validate.rules).bool.const = 1.23] |
大于 | [(validate.rules).int32.gt = 10] |
大于等于 | [(validate.rules).int32.gte = 10] |
小于 | [(validate.rules).int32.lt = 10] |
小于等于 | [(validate.rules).int32.lte = 10] |
大小于区间 | [(validate.rules).double = {lt:30, gte:40}] |
在xxx内 | [(validate.rules).uint32 = {in: [1,2,3]}] |
不在xxx内 | [(validate.rules).float = {not_in: [0, 0.99]}] |
如果字段为空,则忽略掉验证规则 | [(validate.rules).uint32 = {ignore_empty: true, gte: 200}] [(validate.rules).string = {ignore_empty: true, len: 2}] |
字符串长度必须要等于N | [(validate.rules).string.len = 5] |
字符串长度必须大于N | [(validate.rules).string.min_len = 3] |
字符串长度必须小于N | [(validate.rules).string.max_len =10] |
字符串长度必须在N到M之间 | [(validate.rules).string = {min_len: 5, max_len: 10}] |
字符串最大字节数为N | [(validate.rules).string.max_bytes = 15] |
字符串最小字节数为N | [(validate.rules).string.min_bytes = 15] |
字符串字节数必须在N到M之间 | [(validate.rules).string = {min_bytes: 128, max_bytes: 1024}] |
字符串必须与正则表达式匹配 | [(validate.rules).string.pattern = "(?i)^[0-9a-f]+$"] |
字符串前缀必须是XXX | [(validate.rules).string.prefix = "foo"] |
字符串必须以xxx结尾 | [(validate.rules).string.suffix = "bar"] |
字符串必须包含xxx | [(validate.rules).string.contains = "baz"] |
字符串不能包含xxx | [(validate.rules).string.not_contains = "baz"] |
字符串必须以xxx开头,xxx结尾 | [(validate.rules).string = {prefix: "fizz", suffix: "buzz"}] |
字符串必须以xxx结尾,且长度最大为N | [(validate.rules).string = {suffix: ".proto", max_len:64}] |
字符串的值只能是xxx内的 | [(validate.rules).string = {in: ["foo", "bar", "baz"]}] |
字符串的值不能是xxx内的 | [(validate.rules).string = {not_in: ["fizz", "buzz"]}] |
字符串必须是email格式 | [(validate.rules).string.email = true] |
字符串必须是ip或者hostname格式 | [(validate.rules).string.address = true] |
字符串必须是hostname格式 | [(validate.rules).string.hostname = true] |
字符串必须是ipv4或者ipv6格式 | [(validate.rules).string.ip = true] |
字符串必须是ipv4格式 | [(validate.rules).string.ipv4 = true] |
字符串必须是ipv6格式 | [(validate.rules).string.ipv6 = true] |
字符串必须是uri格式 | [(validate.rules).string.uri_ref = true] |
字符串必须是uuid格式 | [(validate.rules).string.uuid = true] |
字符串必须是http header name的字段 | [(validate.rules).string.well_known_regex = HTTP_HEADER_NAME] |
字符串必须是http header values的值 | [(validate.rules).string.well_known_regex = HTTP_HEADER_VALUE] |
必须是枚举中的值之一 | enum State { INACTIVE = 0; PENDING = 1; ACTIVE = 2; } [(validate.rules).enum.defined_only = true] |
指定不校验每个字段规则 | [(validate.rules).message.skip = true] |
指定字段必传 | Person x = 1 [(validate.rules).message.required = true] |
字段中至少要有几个元素(用于判断json的array) | repeated int32 x = 1 [(validate.rules).repeated.min_items = 3] |
字段中的元素个数在M到N之间(用于判断json的array) | repeated Person x = 1 [(validate.rules).repeated = {min_items: 5, max_items: 10}]; |
字段中的元素必须全部唯一,不能重复(用于判断json的array) | repeated int64 x = 1 [(validate.rules).repeated.unique = true]; |
字段中至少有多少个kv | map<string, uint64> x = 1 [(validate.rules).map.min_pairs = 3]; |
字段中最多有多少个kv | map<string, uint64> x = 1 [(validate.rules).map.max_pairs = 3]; |
字段中kv个数在M到N之间 | map<string, string> x = 1 [(validate.rules).map = {min_pairs: 5, max_pairs: 10}]; |
以上规则就是protoc-gen-validae中常用的一些规则。在实际项目开发中如使用到,可以对应上面的表格进行查找。
还没有评论,来说两句吧...