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

沐芓李 · May 18, 2017 · 1094 hits

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

项目背景

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 条回复 时间 点赞
沐芓李 代码入门 中提及了此贴 18 May 16:54
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up