校验保护两侧
自助服务的参数校验承担两个职责:让用户不因输入错误浪费一次交付,也让平台不因非法参数接受越界请求。校验分三层:格式与类型、业务规则、环境约束。缺任何一层,错误都会推迟到执行阶段暴露,而那时往往已经占用资源或产生了部分变更。
基本信息
| 第一层 | 类型、格式、长度、枚举范围 |
|---|---|
| 第二层 | 业务规则,如名称唯一、命名规范、参数依赖 |
| 第三层 | 环境约束,如剩余配额、网络段可用性、权限边界 |
| 校验时机 | 提交时校验并给出可读原因,执行前再校验一次 |
| 错误反馈 | 指出具体字段与合法取值范围 |
典型使用场景
- 名称与标识:校验格式与唯一性,避免与既有资源冲突
- 数值型参数:限制上下限与步长,避免申请超出容量的规格
- 参数依赖:某些组合互斥或必须成对出现,需要交叉校验
- 权限边界:校验申请人对目标范围是否有权,防止越权交付
- 执行前复核:提交到执行期间环境可能变化,需再次校验
校验层次对照
| 层次 | 校验内容 | 漏掉的后果 |
|---|---|---|
| 格式类型 | 结构、长度、枚举 | 解析直接报错,体验差 |
| 业务规则 | 唯一性、命名规范、依赖 | 执行到中途失败,留下半成品 |
| 环境约束 | 配额、网络段、权限 | 被策略拦截或越权交付成功 |
| 执行前复核 | 提交到执行期间的变化 | 基于过期信息交付 |
提交时与执行前都校验
提交时与执行前都校验
# 第一层:格式与取值范围的即时校验,给出可读原因
case $size in
small|medium) : ;; # 允许的取值集合
*) echo 参数size只允许small或medium; exit 2 ;;
esac
# 第二层:业务规则,检查名称是否已被占用
[ -z $(db_query name=$name) ] || { echo 名称已存在; exit 2; }
# 第三层:执行前复核配额与环境,避免用过期信息交付
quota_check $team $type || { echo 配额不足; exit 3; }校验失败必须指出具体字段与允许值。只返回一句参数错误的提示,会迫使申请人与平台值班反复沟通,把自助化节省的时间又消耗在澄清问题上。
提交时校验通过不代表执行时仍然合法。配额、名称唯一性与网络地址可能在这段时间内变化,因此执行前必须再次校验,并把失败结果回写到申请状态。