1、Controller層
1.1get方法輸入對應的參數,其中可以設置不必要的參數,以及默認參數
public Result byJsonMethod(
@RequestParam("requestUrl") String requestUrl,
@RequestParam("requestUrl2") String requestUrl2,
@RequestParam(required = false, defaultValue = "") String params1,
@RequestParam(required = false, defaultValue = "") String params2,
@RequestParam(required = false, defaultValue = "") String headers1,
@RequestParam(required = false, defaultValue = "") String headers2,
@RequestParam(required = false, defaultValue = "") String userCookies1,
@RequestParam(required = false, defaultValue = "") String userCookies2,
HttpServletRequest request) {
Map<String, String> param1;
Map<String, String> param2;
Map<String, String> header1;
Map<String, String> header2;
Map<String, String> userCookie1;
Map<String, String> userCookie2;
try {
param1 = parameterNormalization(params1);
param2 = parameterNormalization(params2);
header1 = parameterNormalization(headers1);
header2 = parameterNormalization(headers2);
userCookie1 = parameterNormalization(userCookies1);
userCookie2 = parameterNormalization(userCookies2);
} catch (Exception e) {
System.out.println(e);
return ResultGenerator.genFailedResult("請求參數數據不合法,請檢查後輸入");
}
//將前端的複合參數轉爲map集合封裝到對應的request請求。
try {
requestUrl = URLDecoder.decode(requestUrl, "UTF-8");
requestUrl2 = URLDecoder.decode(requestUrl2, "UTF-8");
String response_body1 = responseApi.Get(requestUrl, param1, header1, userCookie1);
String response_body2 = responseApi.Get(requestUrl2, param2, header2, userCookie2);
return resultByString(response_body1, response_body2);
} catch (Exception e) {
return ResultGenerator.genFailedResult("對比過程中出現錯誤,請重試");
}
}
1.2 參數的格式化,支持Charles格式和json兩種格式。
public Map<String, String> parameterNormalization(String param) {
Map<String, String> paramMap = new HashMap<>();
//若爲空,初始化爲null
if (param.isEmpty()) {
paramMap = null;
} else if (param.charAt(0) == '{') { //在這裏判斷參數是如何傳遞到後端的--1、json-{"":"","":""}類型;2、字符串(頁面展示key=value;這種類型)
paramMap = JSONObject.parseObject(param, Map.class);
} else {
String[] keyValues = param.split(";");
for (int i = 0; i < keyValues.length; i++) {
String[] key_value = keyValues[i].split("=");
String key = key_value[0];
String value = key_value[1];
paramMap.put(key, value);
}
}
return paramMap;
}
1.3 Post方法--直接傳入文本內容
@ResponseBody
public Result byJsonMethodStringss(
@RequestBody DiffPostParams diffPostParams) {
try{
/* JSONObject requestBody2 = diffPostParams.getRequestBody2();
String sq = requestBody2.toString(SerializerFeature.WriteMapNullValue);
String s2 = diffPostParams.getRequestBody2().toString();
System.out.println("s2"+s2+"---"+sq);
System.out.println(diffPostParams.getRequestBody2());*/
//2019.8.12解決了在Json轉爲String出現的忽視null字段的問題。
return resultByString(diffPostParams.getRequestBody1().toString(SerializerFeature.WriteMapNullValue), diffPostParams.getRequestBody2().toString(SerializerFeature.WriteMapNullValue));
} catch (Exception e) {
return ResultGenerator.genFailedResult("請求參數數據不合法,請檢查後輸入");
}
}
1.4 將傳入的string轉爲JsonObject類型
public Result resultByString(String response_body1, String response_body2) {
try {
int status1 = diffTools.verificationBykey(response_body1);
int status2 = diffTools.verificationBykey(response_body2);
if (status1 != 1 && status1 != 2 || status1 != status2 || status2 != 1 && status2 != 2) {
return ResultGenerator.genFailedResult("請求數據中含有不合法數據,請檢查後輸入");
}
if (status1 == 2) {
/*JSONObject.parseObject(response_body1, SerializerFeature.WRITE_MAP_NULL_FEATURES);
net.sf.json.JSONObject jsonObjectss = net.sf.json.JSONObject.fromObject(response_body2);*/
JSONObject jsonObject1 = JSONObject.parseObject(response_body1);
JSONObject jsonObject2 = JSONObject.parseObject(response_body2);
//2019.8.12
JSONObject resultByJson = diffService.getResultByJson(jsonObject1, jsonObject2);
if (resultByJson.getJSONObject("diff").size() >= 1) {
return ResultGenerator.genOkResult(resultByJson, "兩個接口返回值不一致");
} else {
return ResultGenerator.genOkResult(resultByJson);
}
} else {
JSONArray jsonArray1 = JSONArray.parseArray(response_body1);
JSONArray jsonArray2 = JSONArray.parseArray(response_body2);
JSONObject resultByJson = diffService.getResultByJson(jsonArray1, jsonArray2);
if (resultByJson.getJSONObject("diff").size() >= 1) {
return ResultGenerator.genOkResult(resultByJson, "兩個接口返回值不一致");
} else {
return ResultGenerator.genOkResult(resultByJson);
}
}
} catch (Exception e) {
return ResultGenerator.genFailedResult("請求數據不合法,請檢查後輸入");
}
}
2、Service層
public JSONObject generalMethod(Object o1, Object o2, int i, JSONObject resultJson, String original_key) {
/* if(o1==null){
o1=01;
}
if (o2==null){
o2=01;
}*/
int status = diffTools.verificationBykey(o1);
int status2 = diffTools.verificationBykey(o2);
// 兩種URL雖然key相等,但是對應的value類型不想等,例如一個是數組,另一個是json
if (status != status2) {
resultJson.put(++diffCount + "", "在" + i + "層錯誤," + original_key + "對應的值類型不一致。value1:" + o1 + ";value2:" + o2);
return resultJson;
}
// 兩種URL類型相等,都是嵌套了一個數組,需要繼續進行解析
if (status == 1) {
JSONArray jsonArray1 = JSONArray.parseArray(o1.toString());
JSONArray jsonArray2 = JSONArray.parseArray(o2.toString());
if (jsonArray1.size() != jsonArray2.size()) {
resultJson.put(++diffCount + "", "在" + i + "層錯誤,結構不一致"+ original_key);
return resultJson;
}
for (int k = 0; k < jsonArray1.size(); k++) {
//數組不當做嵌套關係,平級關係,所以這裏i不在+1。所以key也不需要傳入複合狀態。
resultJson = generalMethod(jsonArray1.get(k), jsonArray2.get(k), i, resultJson, original_key);
}
}
// 兩種URL類型相等,都是嵌套了一個json,需要繼續進行解析
if (status == 2) {
//2019.8.12
System.out.println(o1.toString());
Map map = JSONObject.parseObject(o1.toString(), Map.class);
JSONObject jsonObject = new JSONObject(map);
System.out.println("-----"+jsonObject.toString());
JSONObject jsonObject1 = JSONObject.parseObject(o1.toString());
JSONObject jsonObject2 = JSONObject.parseObject(o2.toString());
if (jsonObject1.size() != jsonObject2.size()) {
resultJson.put(++diffCount + "", "在" + i + "層錯誤,結構不一致"+ original_key );
return resultJson;
}
for (String key : jsonObject1.keySet()) {
// 根據每次得到的map1集合中的key,map2.contains()方法判斷是否含有key,
if (jsonObject2.keySet().contains(key)) {
resultJson = generalMethod(jsonObject1.get(key), jsonObject2.get(key), i + 1, resultJson, original_key + ":" + key);
} else {
resultJson.put(++diffCount + "", "第" + i + "層錯誤,接口1中的key:" + key + " 在接口2結果中不存在");
}
}
}
// 兩種URL類型相等,都是普通的鍵值對,可以直接判斷
if (status == 5) {
boolean result_value = o1.equals(o2);
if (result_value == false) {
//考慮如何更友好的顯示到前端
resultJson.put(++diffCount + "-" + original_key, "在" + i + "層錯誤," + original_key + "對應的value不同。value1:" + o1 + "。value2:" + o2);
return resultJson;
//resultJson.put(original_key,"對應的值不一致");
}
}
//其他結果爲:兩者都爲null;兩者都是空字符串;
return resultJson;
}
/**
* Json方式-----遍歷第一層
*
* @param json1
* @param json2
* @return
*/
@Override
public JSONObject getResultByJson(JSONObject json1, JSONObject json2) {
// 0.方法返回結果
JSONObject resultJson = new JSONObject();
JSONObject resultJson_final = new JSONObject();/*
String data_api_1 = JSONObject.toJSONString(json1, SerializerFeature.WriteMapNullValue);
String data_api_2 = JSONObject.toJSONString(json2, SerializerFeature.WriteMapNullValue);
JSONObject jsonObject = JSONObject.parseObject(data_api_2);
Object parse = JSONObject.parse(data_api_2);
System.out.println(
data_api_2+"有沒有error"
);*/
resultJson_final.put("data_api_1", json1);
resultJson_final.put("data_api_2", json2);
// 1、分解第一層
int i = 0;
int j = 1;
if (json1.size() != json2.size()) {
resultJson.put(diffCount + "", "在" + i + "層錯誤,二者體系結構不同");
resultJson_final.put("diff", resultJson);
return resultJson_final;
}
for (String key : json1.keySet()) {
// 根據每次得到的key,map2.contains()方法判斷是否含有key,
//2019.8.12暫時修改,Json反序列化會報錯,考慮是否實現序列化接口
if (json2.keySet().contains(key)) {
/* System.out.println("json1.getJSONObject(key).toString();"+json1.getJSONObject(key).toString());
System.out.println("json1.getJSONObject(key).toString();"+json1.getJSONObject(key).toString());
System.out.println("--第二級別json1.get(key):"+json1.get(key));
System.out.println("--第二級別json1.get(key):"+json2.toString());
JSONObject.toJSONString(json1);
String jsonString1 = JSONObject.toJSONString(json1, SerializerFeature.WriteMapNullValue);
String jsonString2 = JSONObject.toJSONString(json2, SerializerFeature.WriteMapNullValue);
System.out.println("顯示null"+jsonString2);
resultJson = generalMethod(json1.get(key), json2.get(key), i + 1, j, resultJson, key);
String json2String = json2.getString(key);
System.out.println(json2String);
System.out.println("2"+json2.get(key).toString());
*/
//System.out.println("1"+json2.getJSONObject(key).toString());
resultJson = generalMethod(json1.get(key), json2.get(key), i + 1, resultJson, key);
} else {
resultJson.put(diffCount + "", "在" + i + "層錯誤,接口1中的key:" + key + "在接口2不存在");
}
}
resultJson_final.put("diff", resultJson);
return resultJson_final;
}