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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值