【diff對比工具】後端實現兩個接口的對比

 

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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章