数据合法性检测
坦诚我们自己做的也不够好,这里只能抛砖引玉,看看大家是否有更好办法。
我们有这么几个主要的合法性检查场景:
- JSON 数据格式
- 关键字段编码为 HEX(0-9,a-f,A-F),长度不定
- TABLE 内部字段类型
JSON 数据格式
这里主要是 json decode 时,可能抛出异常的问题。我们已经在 一章中详细说明了问题本身以及解决方法,这里就不再重复。
关键字段编码为 HEX,长度不定
HEX 编码,最常见的存在有 MD5 值等。他们是由 0-9,A-F(或 a-f)组成。笔者把使用过的代码版本逐一罗列,并进行性能测试。通过这个测试,我们不仅仅可以收获参数校验的正确写法,以及可以再次印证一下效率最高的匹配,应该注意什么。
check_hex_lua times:1.0390000343323
check_hex_default times:5.1929998397827
check_hex_jo times:0.4539999961853
不知道这个结果大家是否有些意外,check_hex_default
的运行效率居然比 check_hex_lua
要差。不过所幸的是我们对正则开启了 参数优化后,速度上有明显提升。
引用一下 ngx.re.* 官方 wiki 的原文:在优化性能时,o
选项非常有用,因为正则表达式模板将仅仅被编译一次,之后缓存在 worker 级的缓存中,并被此 Nginx worker 处理的所有请求共享。缓存数量上限可以通过 lua_regex_cache_max_entries 指令调整。
TABLE 内部字段类型
当我们接收客户端请求,除了指定字段的特殊校验外,我们最常见的需求就是对指定字段的类型做限制了。比如用户注册接口,我们就要求对方姓名、邮箱等是个字符串,手机号、电话号码等是个数字类型,详细信息可能是个图片又或者是个嵌套的 TABLE。
这时候可以用一个简单的字段描述格式来表达限制关系,如下:
{
"username":"",
"age":0,
"mobile_no":0,
"email":"",
"love_things":[]
}
对于有效字段描述格式,数据值是不敏感的,但是数据类型是敏感的,只要数据类型能匹配,就可以让我们轻松不少。
来看下面的参数校验代码以及基本的测试用例:
运行一下上面的代码,结果如下:
➜ resty test.lua
如果你有更好更优雅的解决办法,欢迎与我们联系。