あなたの高い確率は、コード無敵の魔法の農家を貼り付け、コードをコピーすることを学んだ、実際には、長い時間の事業開発機能をやって、彼は遅かれ早かれものということ、その2つの無敵の魔法を学びました。今日のあなたのRenduermaiを介して取得する小さな問題をスローする最初の、頼むことは非常に好奇心です:事業開発機能を、入力パラメータ指定を行うどのくらいの時間のアカウントをチェック!あなたはユニバーサル、モジュラー検証する方法を検討していますか?
まだ別の質問を参照する方法を見員の芳香族、頼まれます。あなたはどのように見えるか元牙「ビジネスのAPIの堅牢性を確保するための方法を最後に」?
そう考えずに答えるために「小さな猿応力」国民の多数員の長時間芳香族、多かれ少なかれ少し進行を懸念:キャリブレーションAPIの入力パラメータことを確保するためにすべての最初の、そして......
「キャリブレーションAPIの入力パラメータことを確保するために、まず」聞いて、彼が今日の私たちの話題をこじ開けので、プレイアウト元牙する必要があります。
まあ、小さなベンチを準備さんはどのように楽しい、生のラインとフレームワークAPIのパラメータチェックを見てみましょう。
1。
従来の書き込み。
注:私は唯一のLiを説明し与えるために使用されるスクリーンショット上記のコード、死者を書くための一時的なリターンの情報は、動的にリターンコードを設定して説明したJSONのリターンとしてパッケージを返す必要があります。
図に使用するコードの栗、だけでなく、多くの新規参入者の好みの方法は、結局、「コードの量は金なり」と考えるのは間違っている職場に入るプログラム猿の目には、それはSVNであるか、またはあなたがいるので、レコードを更新する以上のものを保持したいGitはあり更新レコード(Wuzuiが笑)コードと労働AHの量を反映することです。
しかし、多くの場合、単純なAPIインターフェイスパラメータの数十限り多くの唯一の2つの入力パラメータは、それがコードスペースの多くは、パラメータチェックを行っている、それは、パラメータがチェックインし、それは多くの時間と労力を費やすだろうであることを意味します。
実際には、チェックステップにAPIインターフェイスパラメータは、我々はに分けることができます。interface入力パラメータを取得します。パラメータが渡され通過します確認してください。パラメータがルールに準拠していることを確認します。
実際には、法律が見つかったら、マシンはそれを行うために引き渡されることができ、その後、我々は確かに効率的なホイールのAPIのパラメータチェックを作成することができます。
2。
車輪の構図は何をすべきですか?
インターフェイスにA.構成パラメータ。
B.構成パラメータの検証ルール。
故障および異常情報にC.パッケージングパラメータ検証エラーコード。
上記の組み合わせを考えると、ちょうど秒を理解するために地図上の簡単なフローチャートにそれを描いてみましょう。
3。
あなたがたは、達成すべきホイール?
コンフィギュレーション・ファイルparam.propertiesにA.定義APIインターフェイスパラメータ
########业务功能健壮性参数规则配置############################
#接口参数配置=Param group(按照|分割参数组,按照逗号分隔每组的参数)
##########################################################
#系统接口所需参数配置(PARAMS.apiURL=参数列表)
PARAMS./sys/login.do=username,password复制代码
定期的なチェックregex.propertiesのB.定義APIインターフェイスパラメータ
########业务功能健壮性参数规则配置############################
#接口参数正则表达式配置(PARAMS.接口URL.参数.regex=正则表达式)
PARAMS./sys/login.do.username.regex=\\w{1,32}
#全局参数正则表达式配置(参数.regex=正则表达式)
password.regex=\\w{1,32}复制代码
学生はラインとコードC.を開始します
STEP 1:APIに従ってパラメータ設定要求に対応するインタフェースを入手する方法。
ステップ2:ルールを遵守して渡されたパラメータの値を確認してください。各APIは、ケースに渡されたパラメータの複数のセットをサポートしているので、続くことが可能である|「」パラメータの分裂複数のセットを
第三段階:規則に従って渡されたパラメータの値か否かを検証する、実際の検証ロジック。
ステップ4:使用場所のように、簡単にはそう、パッケージ・サービスの中に一緒に私たちのフローチャート、上記の方法で文字列によると!!!方法doServiceパラメータは、apiUrlインタフェースはURLであり、JSONパラメータが渡されます。
「小さな猿が強調し、」公共の態度の数があり、公共の数字の温度が、彼らはまだあなたにコードをごので、より良い進歩を大きなシェアを取る必要があります。
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
/**
* 请求参数校验服务
* desc:
* 1、通过传入的apiUrl找到需要校验的数据(param.properties),
* 2、通过传入的参数key找到对应的正则表达式(regex.properties),
* 3、对需要校验的数据进行正则表达式
* 4、支持必填非必填字段校验
*/
public class RequestParamCheckService {
public static final String REGKEY = "PARAMS.";
public static final String REGEX = ".regex";
public void doService(String apiUrl, JSONObject json) {
//1. 校验 API URL 是否传入
if (StringUtils.isEmpty(apiUrl)) {
System.out.println("Miss api url");
return;
}
//2. 根据 API URL 获取参数的配置
String paramKeyConf = StringUtils.trim(getKeyByApiUrl(apiUrl));
if (StringUtils.isEmpty(paramKeyConf)) {
System.out.println(String.format("%s found no check info", apiUrl));
return;
}
//3. 验证传入参数的值是否符合配置定义的规则
boolean[] validateAry = validate(apiUrl, paramKeyConf, json);
//4. 校验参数校验结果
if (!ArrayUtils.contains(validateAry, true)) {
System.out.println(String.format("%s param validate fail", apiUrl));
//TODO 此处需要根据字段获取对应的返回码以及返回信息,可以自行扩展实现一下,本次硬编码
throw new ValidateException("99999999", "参数校验失败");
}
}
/**
* 验证传入参数的值是否符合配置定义的规则
*
* @param apiUrl 接口
* @param paramKeyConf 配置的参数key
* @param json 传入的json报文内容
* @return 验证结果
*/
private boolean[] validate(String apiUrl, String paramKeyConf, JSONObject json) {
// 将KEY分隔
String[] chkKeys = paramKeyConf.split("\\|");
//判断拆分后的参数是否为组合配置
//针对每组参数校验是否传入,最后得出参数传入是否正确
boolean[] validateAry = new boolean[chkKeys.length];
for (int i = 0; i < chkKeys.length; i++) { //针对每个参数组进行验证
String[] unitKeyAry = chkKeys[i].split(","); //按照逗号拆分每组的参数key配置
validateAry[i] = check(apiUrl, json, unitKeyAry); //校验参数是否符合规则
}
return validateAry;
}
/**
* 校验传入的参数是否符合规则
*
* @param apiUrl 校验的apiUrl
* @param json 传入的json报文数据
* @param keyAry 参数数组
* @return 校验结果
*/
private boolean check(String apiUrl, JSONObject json, String[] keyAry) {
//验证是否通过,默认为true通过
boolean isCheckSucc = true;
for (String unitKey : keyAry) {
//按照括号拆分,区分是必填还是选填,参数传入就要进行验证正则
//获取"("首次出现的位置
boolean isOptional = isOptionalParam(unitKey);
//非必传
if (isOptional) {
unitKey = removBrackets(unitKey);
}
//针对每组参数进行必传校验、针对每组参数进行格式校验
if (!check(apiUrl, unitKey, json, !isOptional)) {
//验证失败
isCheckSucc = false;
break;
}
}
return isCheckSucc;
}
/**
* 根据apiUrl从配置文件读取key
*
* @param apiUrl
* @return apiUrl 对应的入参配置
*/
public String getKeyByApiUrl(String apiUrl) {
//例如:请求的apiUrl为 /sys/login.do 则 key 为 PARAMS./sys/login.do
// 其中apiUrl 对应的参数值为 username,password
return ConfigUtils.getConfig(REGKEY + apiUrl);
}
/**
* 根据apiUrl从配置文件读取入参对应的正则
*
* @param apiUrl
* @return
*/
public String getKeyRegex(String apiUrl, String paramKey) {
// 优先根据 PARAMS.接口URL.参数.regex 为key获取对应的正则校验规则
String key = REGKEY + apiUrl + "." + paramKey + REGEX;
//TODO 根据 key 读取 regex.properties 配置文件获取正则表达式
String keyRegex = StringUtils.trim(ConfigUtils.getConfig(key));
if (StringUtils.isEmpty(keyRegex)) {
// 如果根据 PARAMS.接口URL.参数.regex 为key没有对应的正则校验规则
// 则直接根据参数 参数.regex 为key 获取配置的正则校验规则
keyRegex = ConfigUtils.getConfig(paramKey + REGEX);
}
return keyRegex;
}
/**
* 真正的校验逻辑,通过配置的正则表达式校验字段是否符合规范
*
* @param apiUrl 待校验的接口URL
* @param paramKey 参数key
* @param json 传入的json报文串
* @param must 是否必传参数
* @return 验证结果
*/
protected boolean check(String apiUrl, String paramKey, JSONObject json, boolean must) {
String value = StringUtils.trim(json.getString(paramKey));
if (StringUtils.isEmpty(value)) {
// 必传字段为空,验证fail
if (must) {
System.out.println(String.format("Request Parameter %s is Empty", paramKey));
return false;
}
} else {
String regex = getKeyRegex(apiUrl, paramKey);
if (StringUtils.isEmpty(regex)) {
System.out.println(String.format("Request Parameter %s found no regex info", paramKey));
return true;
}
// 去掉空格字符
value = value.replaceAll("\\s*", "");
// 不符合正则表达式
if (!value.matches(regex)) {
System.out.println(String.format("Request Parameter %s[%s] cannot match the regex[%s]", paramKey, value, regex));
return false;
}
}
return true;
}
/**
* 去除中括号
*
* @param key 待校验的Key
* @return 去除中括号的字符串
*/
private String removBrackets(String key) {
return key.substring(1, key.length() - 1);
}
/**
* 是否是必须的字段
*
* @param key 待校验的Key
* @return 必须字段返回true, 否则返回false
*/
private boolean isOptionalParam(String key) {
return key.startsWith("[") && key.endsWith("]");
}
}复制代码
まあ、ラインおよび検証フレームワーク上の生命は、ここでそれを共有するために、実際には、そこに深いノーと言うために多くの詳細がありますが、一般的にアイデアを話すが、コメントを書き込まれたコードは非常に明確です。あなたが理解し、実際のプロジェクトに適用することができれば、それは確かに大幅にコーヒーを作るために多くの時間を解放し、開発効率を向上させます。
最後に、あなたは少し助けを感じるならば、あなたはもっと素晴らしい共有するための「小さな猿応力」マイクロチャンネル公衆数を見ることができます。