API 入参校验引擎(专业版)
输入
validate_field(value,rules);validate_payload(payload,schema),rules支持required/type/min/max/enum/regex
输出
字段错误码列表;{valid:bool, errors:{field:[codes]}}
硬性规则
- 缺失且required→["required"];非必填缺失→[]。
- bool不通过int校验;min/max对str/list按长度、数值按大小。
- 任一字段有错 valid=False,错误聚合不短路。
示例
validate_payload({"age":200},{"age":{"required":True,"type":"int","min":0,"max":120}})["valid"] → False
validate_payload({"name":"ab"},{"name":{"type":"string","min":3}})["errors"]["name"] → ["min"]
validate_payload({"x":True},{"x":{"type":"int"}})["errors"]["x"] → ["type"]
Python 引擎(可独立运行)
# -*- coding: utf-8 -*-
import re
def _type_ok(value, typ):
if typ == "int":
return isinstance(value, int) and not isinstance(value, bool)
if typ == "float":
return isinstance(value, (int, float)) and not isinstance(value, bool)
if typ == "bool":
return isinstance(value, bool)
if typ == "string":
return isinstance(value, str)
if typ == "list":
return isinstance(value, list)
return True
def validate_field(value, rules):
"""校验单字段,返回错误码列表(空=通过)。
支持 required/type/min/max/enum/regex;min/max对字符串列表为长度、对数值为大小。"""
errs = []
typ = rules.get("type")
missing = value is None or value == ""
if missing:
if rules.get("required"):
errs.append("required")
return errs
if typ and not _type_ok(value, typ):
errs.append("type")
if "min" in rules or "max" in rules:
n = len(value) if isinstance(value, (str, list)) else value
if isinstance(n, (int, float)) and not isinstance(n, bool):
if "min" in rules and n < rules["min"]:
errs.append("min")
if "max" in rules and n > rules["max"]:
errs.append("max")
if "enum" in rules and value not in rules["enum"]:
errs.append("enum")
if "regex" in rules and isinstance(value, str) and not re.match(rules["regex"], value):
errs.append("regex")
return errs
def validate_payload(payload, schema):
"""按schema校验整个payload,聚合字段级错误。"""
errors = {}
for field, rules in schema.items():
e = validate_field(payload.get(field), rules)
if e:
errors[field] = e
return {"valid": not errors, "errors": errors}