服务器端接口参数校验方法
来源:互联网 发布:如何获取微博数据 编辑:程序博客网 时间:2024/06/05 17:21
一开始写接口时,参数校验各种if判断,一坨坨的,看的要吐了,以下是屎一般的代码示例:
if (!array_key_exists("cconf_corp_id", $data)) { return_json(1, "缺少参数:cconf_corp_id!", null); } if (!array_key_exists("cconf_closing_time", $data)) { return_json(1, "缺少参数:cconf_closing_time!", null); } if (!array_key_exists("cconf_delivery_time", $data)) { return_json(1, "缺少参数:cconf_delivery_time!", null); }
区区三个参数的存在判断就写了9行,这还只是存在,如果再加上值范围、值长度、值内容等的判断,就更多了!
找了一番资料后,修改如下:
<?php/** * 数组校验 * @param array $data 数据 * @param string $name 参数名称 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @param integer $min 最小值(含) * @param integer $max 最大值(含) * @return mixed 成功: true, 失败: 抛出异常 */function check_array(&$data, $name, $necessary, $min = null, $max = null) { if (is_null($data)) { if (0 < $necessary) { throw new Exception($name . "参数缺失!"); } return true; } else { if (0 > $necessary) { throw new Exception($name . "参数当前不允许存在!"); } } $count = count($data); if (null !== $min and null === $max) { if ($count < $min) { throw new Exception($name . "元素数量超出限制,需大于等于$min!"); } } elseif (null === $min and null !== $max) { if ($count > $max) { throw new Exception($name . "元素数量超出限制,需小于等于$max!"); } } elseif (null !== $min and null !== $max) { if ($count < $min or $count > $max) { throw new Exception($name . "元素数量超出限制,大小范围为$min-$max!"); } } return true;}/** * 小数校验 * @param mixed $data 数据(数字或字符串,字符串最后会被转换成数字) * @param string $name 参数名称 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @param integer $min 最小值(含) * @param integer $max 最大值(含) * @param integer $decimal_min 最小小数位数 * @param integer $decimal_max 最大小数位数 * @return mixed 成功: true, 失败: 抛出异常 */function check_decimal(&$data, $name, $necessary, $min = null, $max = null, $decimal_min = 0, $decimal_max = 2) { if (is_null($data)) { if (0 < $necessary) { throw new Exception($name . "参数缺失!"); } return true; } else { if (0 > $necessary) { throw new Exception($name . "参数当前不允许存在!"); } } $filter = "/^[+-]{0,1}[\\d]{1,}[.]{0,1}[\\d]{" . $decimal_min . "," . $decimal_max . "}$/"; if (!preg_match($filter, strval($data))) { throw new Exception($name . "需为数字(小数点后$decimal_min-$decimal_max" . "位)!"); } $data = floatval($data); if (null !== $min and null === $max) { if ($data < $min) { throw new Exception($name . "数值大小超出限制,需大于等于$min!"); } } elseif (null === $min and null !== $max) { if ($data > $max) { throw new Exception($name . "数值大小超出限制,需小于等于$max!"); } } elseif (null !== $min and null !== $max) { if ($data < $min or $data > $max) { throw new Exception($name . "数值大小超出限制,大小范围为$min-$max!"); } } return true;}/** * 长整数校验 * @param mixed $data 数据(数字或字符串,字符串最后会被转换成数字) * @param string $name 参数名称 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @param integer $min 最小值(含) * @param integer $max 最大值(含) * @return mixed 成功: true, 失败: 抛出异常 */function check_long(&$data, $name, $necessary, $min = null, $max = null) { if (is_null($data)) { if (0 < $necessary) { throw new Exception($name . "参数缺失!"); } return true; } else { if (0 > $necessary) { throw new Exception($name . "参数当前不允许存在!"); } } if (!preg_match("/^[+-]{0,1}[\\d]{1,}$/", strval($data))) { throw new Exception($name . "需为整数数字!"); } $data = intval($data); if (null !== $min and null === $max) { if ($data < $min) { throw new Exception($name . "数值大小超出限制,需大于等于$min!"); } } elseif (null === $min and null !== $max) { if ($data > $max) { throw new Exception($name . "数值大小超出限制,需小于等于$max!"); } } elseif (null !== $min and null !== $max) { if ($data < $min or $data > $max) { throw new Exception($name . "数值大小超出限制,大小范围为$min-$max!"); } } return true;}/** * 字符串校验 * @param string $data 数据 * @param string $name 参数名称 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @param integer $min 长度最小值(含) * @param integer $max 长度最大值(含) * @param boolean $number 是否包含数字(0不包含,1包含) * @param integer $letter 是否包含字母(0不包含,1包含小写,2包含大写,3包含大小写) * @param boolean $chinese 是否包含中文(0不包含,1包含) * @param string $symbol 包含符号(null不包含, "all"包含所有符号,包含个别符号如: ",.?/;") * @return mixed 成功: true, 失败: 抛出异常 */function check_string(&$data, $name, $necessary, $min = 0, $max = 0, $number = true, $letter = 3, $chinese = true, $symbol = null) { if (is_null($data)) { if (0 < $necessary) { throw new Exception($name . "参数缺失!"); } return true; } else { if (0 > $necessary) { throw new Exception($name . "参数当前不允许存在!"); } } $data = trim($data); if (strlen($data) < $min or strlen($data) > $max) { throw new Exception($name . "($data)长度超出限制,长度范围为$min-$max!"); } $format = array(); $number_filter = ""; if (true === $number) { $number_filter = "0-9"; array_push($format, "数字"); } $letter_filter = ""; if (1 === $letter) { $letter_filter = "a-z"; array_push($format, "小写字母"); } elseif (2 === $letter) { $letter_filter = "A-Z"; array_push($format, "大写字母"); } elseif (3 === $letter) { $letter_filter = "a-zA-Z"; array_push($format, "大小写字母"); } $chinese_filter = ""; if (true === $chinese) { $chinese_filter = "\x7f-\xff"; array_push($format, "汉字"); } $symbol_filter = ""; if (null !== $symbol) { if ("all" === $symbol) { $symbol_filter = "~!@#$%^&*()_+-={}|\ [\ ]\\:\";'<>?,.\/!¥…()—【】、:“”;’《》?,。\s"; } else { $symbol_filter = $symbol; } array_push($format, "'$symbol'符号"); } $filter = "/^[" . $symbol_filter . $number_filter . $letter_filter . $chinese_filter . "]{" . $min . "," . $max . "}$/"; if (!preg_match($filter, $data)) { throw new Exception($name . "($data)格式不正确! 只可包含" . implode("、", $format) . "!"); } return true;}/** * 日期校验 * @param string $data 数据 * @param string $name 参数名称 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @return mixed 成功: true, 失败: 抛出异常 */function check_date(&$date, $name, $necessary) { if (is_null($date)) { if (0 < $necessary) { throw new Exception($name . "参数缺失!"); } return true; } else { if (0 > $necessary) { throw new Exception($name . "参数当前不允许存在!"); } } $check = true; try { check_string($date, $name, $necessary, 10, 10, true, 0, false, "-"); } catch (Exception $e) { $check = false; } if (false === date_create($date) or false === $check) { throw new Exception("$name($date)日期格式需为: 2016-01-01!"); } return true;}/** * 电话校验 * @param string $telephone 客户电话号码 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @return mixed 成功: true */function check_telephone(&$telephone, $necessary) { if (is_null($telephone)) { if (0 < $necessary) { throw new Exception("电话号码为空!"); } return true; } else { if (0 > $necessary) { throw new Exception("电话号码参数当前不允许存在!"); } } $telephone = trim($telephone); if (!preg_match("/^(0[0-9]{2,3}(-)?)?([2-9][0-9]{6,7})(-[0-9]{1,4})?$|^(?:400|800)[0-9]{7}$/", $telephone)) { throw new Exception("无效的电话号码: $telephone!"); } return true;}/** * 手机校验 * @param string $mobile 客户手机号 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @return mixed 成功: true */function check_mobile(&$mobile, $necessary) { if (is_null($mobile)) { if (0 < $necessary) { throw new Exception("手机号为空!"); } return true; } else { if (0 > $necessary) { throw new Exception("手机号参数当前不允许存在!"); } } $mobile = trim($mobile); if (!preg_match("/^13[0-9]{9}$|^15[012356789]{1}[0-9]{8}$|^18[0-9]{9}$|^17[678][0-9]{8}$|^14[57][0-9]{8}$/", $mobile)) { throw new Exception("无效的手机号: $mobile!"); } return true;}/** * 微信校验 * @param string $wx_id 客户微信号 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @return mixed 成功: true */function check_wechat(&$wx_id, $necessary) { if (is_null($wx_id)) { if (0 < $necessary) { throw new Exception('微信号为空!'); } return true; } else { if (0 > $necessary) { throw new Exception('微信号参数当前不允许存在!'); } } $wx_id = trim($wx_id); if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_-]{5,}$/', $wx_id)) { throw new Exception("无效的微信号: $wx_id!"); } return true;}/** * 邮箱校验 * @param string $email 客户邮箱 * @param integer $necessary 是否必须参数(<0禁用参数, =0可有可无, >0必须参数) * @return mixed 成功: true, 失败: string */function check_email(&$email, $necessary) { if (is_null($email)) { if (0 < $necessary) { throw new Exception('邮箱为空!'); } return true; } else { if (0 > $necessary) { throw new Exception('邮箱参数当前不允许存在!'); } } $email = trim($email); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new Exception("无效的邮箱: $email!"); } return true;}/** * 返回json字符串给接口调用者 * @param integer $code 错误码 * @param string $msg 错误信息 * @param string $data 输出数据 */function return_json($code, $msg = null, $data = null) { $ret = array("errcode" => $code,); $ret["errmsg"] = ($msg === null) ? "" : $msg; $ret["data"] = ($data === null) ? "" : $data; echo json_encode($ret, JSON_UNESCAPED_UNICODE); exit();}try { check_date($data["date"], "date", 1); check_long($data["order_id"], "order_id", 1, 1); check_string($data["content"], "content", 1, 0, 140, true, 3, true, "all"); check_array($data["skus"], "skus", 1, 1); foreach ($data["skus"] as $sku) { check_long($sku["publish_id"], "publish_id", 1, 1); check_long($sku["num"], "num", 1, 1); }} catch (Exception $e) { return_json(1, $e->getMessage(), null);}
注:177行中列举的符号,由于编辑器不支持,加了两个空格,实际使用中要去除
若有更好的方式,欢迎指证!
0 0
- 服务器端接口参数校验方法
- WebService接口参数校验实践
- 服务器端接口测试方法推荐
- python flask 服务器端实现接口,post,get 方式,参数获取方法
- java方法参数校验实践
- iap校验接口verifyReceipt-参数含义
- struts2框架输入校验服务器端的两种方法
- 使用服务器端方法获取param参数
- Struts2(服务器端)输入校验
- Struts2(服务器端)输入校验
- Struts2(服务器端)输入校验
- struts2服务器端校验
- SpringMVC:服务器端校验配置
- spring参数校验,form表单形式,以及http接口形式
- 参数校验
- 客户端js校验及服务器端校验安全问题
- 服务器端校验(更重要)和客户端校验
- Android应用(测试/正式)服务器端接口切换方法
- C语言常用运算符优先级
- 有return的情况下try catch finally的执行顺序
- Hibernate的映射关系总结
- Qt creator 中设置命令行参数方法
- 数据库满足第三范式,解题思想
- 服务器端接口参数校验方法
- java Ant 用法 编辑
- hpu-【1059: 次方求和】
- 分布式调度系统的比较
- 20161103
- ICO图标的浏览器兼容性现状与应用方案
- HDU-5119 Happy Matt Friends(背包)
- Java HashCode相关知识
- 解决页面传到后台含中文参数时会乱码问题