使用GoDaddy API批量获取域名时打印结果为Null的问题排查
嘿,我一眼就发现问题出在哪了——你的JsonPath路径和GoDaddy API返回的JSON结构完全不匹配!
核心问题分析
看你提供的JSON响应片段,它是一个直接的顶级数组(格式是[ {...}, {...} ]),没有外层的array字段。但你的代码里不管是断言还是循环取值,都用了array[0].domain、array.size()这种路径——这就是为什么打印出来全是null,因为响应里根本不存在array这个属性!
至于你说断言能通过,我猜你是在替换敏感信息的时候把实际的断言路径写错了?比如你实际写的是body("[0].domain", equalTo("xxx")),但发帖时误写成了array[0].domain,不然断言应该会直接失败才对。
修复方案
把所有涉及array的JsonPath路径都去掉,直接针对顶级数组操作:
1. 修改数组长度获取逻辑
原来的代码:
int count = js.get("array.size()");
改成:
int count = js.get("size()");
2. 修改循环取值逻辑
原来的代码:
String name = js.get("array["+i+"].domain");
改成(用getString()更直接,避免类型转换问题):
String name = js.getString("[" + i + "].domain");
3. 更简洁的写法(可选)
你可以直接用getList()一次性获取所有域名,不用手动循环索引:
List<String> allDomains = js.getList("domain"); for(String domain : allDomains) { System.out.println(domain); } System.out.println(allDomains.size());
修复后的完整Test方法示例
public void Test(){ RestAssured.baseURI = prop.getProperty("GODADDYHOST"); Response res = given() .header("Authorization", prop.getProperty("GODADDYKEY")) .log().all() .header("Content-Type", "application/json") .header("Accept", "application/json") .param("includes", "contacts") .when() .get(Resources.godaddyGetData()) .then() .assertThat().statusCode(200) .and().contentType(ContentType.JSON) .and().body("[0].domain",equalTo("SENSITIVE INFORMATION")) // 这里也要去掉array前缀! .and().body("[0].domainId",equalTo("SENSITIVE INFORMATION")) // 同样修改路径 .and().header("Server", "SENSITIVE INFORMATION") .log().body() .extract().response(); JsonPath js = ReusableMethods.rawToJson(res); // 方式1:索引循环 int count = js.get("size()"); for (int i = 0; i < count; i++){ String name = js.getString("["+i+"].domain"); System.out.println(name); } System.out.println(count); // 方式2:直接获取列表(更简洁) // List<String> domains = js.getList("domain"); // domains.forEach(System.out::println); // System.out.println(domains.size()); }
为什么Google Maps API能正常工作?
因为Google Maps的API响应结构是外层有一个包含数组的对象(比如可能有results或者array字段),所以你当时用的路径是匹配的,但GoDaddy的这个API返回的是纯数组,路径自然不一样啦。
内容的提问来源于stack exchange,提问作者Kable
相关产品推荐
相关产品推荐

