新手区 对接口返回 json 的基本处理

沐芓李 · 2017年05月18日 · 2192 次阅读

测试需求,验证新接口和旧接口的返回结果是否一致。

项目背景

1.涉及到旧接口为 xml 格式,新接口为 json 格式。
2.涉及到新接口有旧接口字段的合并;
3.我只做了简单的对比,如比对两个接口的返回字段是否值相等;
4.项目使用 java 语言,Maven 管理。

主要代码注释

//使用日志
@Slf4j
public class TestUrlMap {
    //设置请求http参数初始化
    public static final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(5, TimeUnit.SECONDS)
            .readTimeout(5, TimeUnit.SECONDS)
            .writeTimeout(5, TimeUnit.SECONDS)
            .build();

    public static void diffMap(String code) throws IOException {

       //如果是读取多条url,可以读取文件,我这里直接赋值了。
       String oldUrl = "oldUrl";
       String newUrl = "newUrl" ;


        //获取body
        String oldData = client.newCall(
                new Request.Builder().url(oldUrl).build())
                .execute().body().string();
        String newData = client.newCall(
                new Request.Builder().url(newUrl).build())
                .execute().body().string();

        if (StringUtils.isAnyBlank(oldData, newData)) {
            log.error("获取数据异常, code={}, oldData={}, newData={}", code, oldData, newData);
        }

        //读取到json里面result的内容
        JSONObject oldJson = JSON.parseObject(oldData).getJSONObject("result");
        //XML转换json,并读取里面result内容
        JSONObject newJson = XML.toJSONObject(newData).getJSONObject("result");

        /**
         *数据示例
         * "adcode": "110000",
         "version": 1601,
         */
         //对比字符串
        if (!StringUtils.equals(oldJson.getString("adcode"), newJson.getString("adcode"))) {
            log.error("code={}, adcode 不一致, {}!={}", code, oldJson.getString("adcode"), newJson.getString("adcode"));
            return;
        }
        //对比整数
        if (oldJson.getInt("version") = newJson.getInt("version")) {
            log.error("code={}, version 不一致, {}!={}", code, oldJson.getInt("version"), newJson.getInt("version"));
            return;
        }

        int count = newJson.getInteger("count");
        JSONArray oldEvents = oldJson.getJSONArray("events");
        JSONArray newEvents = newJson.getJSONArray("events");

        if (count != oldEvents.size() || count != newEvents.size()) {
            log.error("code={} events长度不一致, {}!={}", code, oldEvents.size(), newEvents.size());
            return;
        }

        //下面的for循环是对比json里面的数组
        int newI = 0;
        int linkIndex = 0;
        for (int i = 0; i < oldEvents.size(); i++) {
              String oldEvent = StringUtils.trim(oldEvents.getString(i));

              //获取json数组里面第N个值。
              JSONObject newEvent = newEvents.getJSONObject(newI);
              List<String> oldEventList = Splitter.on(",").splitToList(oldEvent);

               //oldEventList.get(29),查找接口文档确定 i 的值,但是要注意java的下标是从0开始计数。
               if (!StringUtils.equals(Strings.nullToEmpty(newEvent.getString("lonlat")), Strings.nullToEmpty(oldEventList.get(29) + "," + oldEventList.get(30)))) {
                   log.error("code={}, enventIndex={}, lonlat 不一致, {}!={}", code, i, oldEventList.get(29) + "," + oldEventList.get(30), newEvent.getString("lonlat"));
                   return;
               }  
         } 

                //这里做的比较是因为新接口把旧接口的很多相关的niLinkIds字段拼接为一个字段了。
                 String niLinkIdsStr = newEvent.getString("niLinkIds");
                 Iterable<String> split = Splitter.on(",").split(niLinkIdsStr);

                 if (!Iterables.get(split, linkIndex, "").equals(Strings.nullToEmpty(oldEventList.get(26)))) {
                     log.error("code={}, enventIndex={}, niLinkIds 不一致, {}!={}", code, i, oldEventList.get(26), newEvent.getString("niLinkIds"));
                     return;
                  }

                  linkIndex++;
                  if (linkIndex >= Iterables.size(split)) {
                       linkIndex = 0;
                       newI++;
                 }

                 log.info("对比成功");
     }
}

      public static void main(String[] args) throws IOException {

        /*     List<String> codes = Files.readLines(new File("F:/code.txt"), Charset.forName("utf-8"));
         *     for (String code : codes) {
         *     diffMap(code);
         *      }
         *      这是读取文件,传参数的方式,因为我直接给url赋值了,所以直接调用 diffMap() 就可以了。
         */
                 diffMap(code);
       }
}
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 0 条回复 时间 点赞
沐芓李 代码入门 中提及了此贴 05月18日 16:54
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册