如何在Rest Assured中基于前序接口响应构造动态请求
Rest Assured实现方案
整体实现逻辑分为3步:调用API1提取目标字段、构造API2请求体、发起API2请求,具体代码实现如下:
首先确认已引入核心依赖(已引入可跳过):
<!-- Rest Assured核心依赖 --> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>5.3.0</version> <scope>test</scope> </dependency> <!-- Jackson序列化依赖,用于构造JSON请求体 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
方式1:通过POJO类实现(推荐,可维护性更高)
先定义对应实体类简化操作:
// 用于接收API1返回的userSourceMeta字段 @Data public class UserSourceMeta { private String source; private String sourceUserId; // 其他不需要的字段可以不用定义 } // API2请求体的sourceFilterInfo字段对应实体 @Data public class SourceFilterItem { private String source; private String sourceUserId; } // API2完整请求体实体 @Data public class Api2Request { private String query; private String timeZone; private List<SourceFilterItem> sourceFilterInfo; private List<String> contextIds = new ArrayList<>(); }
注:上面POJO类用到的@Data是Lombok注解,会自动生成getter、setter等方法,如果项目没有引入Lombok,手动为字段添加getter、setter方法即可。
核心接口调用逻辑:
import io.restassured.RestAssured; import java.util.List; import java.util.stream.Collectors; public class ApiTest { public void testTwoApiFlow() { // 1. 调用API1获取响应,提取userSourceMeta列表 List<UserSourceMeta> userSourceMetaList = RestAssured.given() .header("Content-Type", "application/json") // 按需补充API1需要的请求头、鉴权信息、请求参数 .when() .get("你的API1接口地址") .then() .statusCode(200) // 提取响应中所有的userSourceMeta字段 .extract() .jsonPath() .getList("userSourceMeta", UserSourceMeta.class); // 2. 转换为API2需要的sourceFilterInfo格式 List<SourceFilterItem> sourceFilterInfo = userSourceMetaList.stream() .map(meta -> { SourceFilterItem item = new SourceFilterItem(); item.setSource(meta.getSource()); item.setSourceUserId(meta.getSourceUserId()); return item; }) .collect(Collectors.toList()); // 3. 构造API2请求体 Api2Request api2Request = new Api2Request(); api2Request.setQuery("hi"); api2Request.setTimeZone("Asia/Calcutta"); api2Request.setSourceFilterInfo(sourceFilterInfo); // 4. 调用API2 RestAssured.given() .header("Content-Type", "application/json") .body(api2Request) .when() .post("你的API2接口地址") .then() .statusCode(200); // 按需补充API2的断言逻辑 } }
方式2:不用POJO,直接用Map构造(适合简单场景快速实现)
import io.restassured.RestAssured; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ApiTest { public void testTwoApiFlowWithoutPojo() { // 1. 调用API1直接提取source和sourceUserId的映射列表 List<Map<String, String>> sourceList = RestAssured.given() .header("Content-Type", "application/json") // 按需补充API1需要的请求头、鉴权信息、请求参数 .when() .get("你的API1接口地址") .then() .statusCode(200) .extract() // 直接提取需要的两个字段,返回Map列表 .jsonPath() .getList("userSourceMeta.collect { [source: it.source, sourceUserId: it.sourceUserId] }", Map.class); // 2. 构造API2请求体 Map<String, Object> api2Body = new HashMap<>(); api2Body.put("query", "hi"); api2Body.put("timeZone", "Asia/Calcutta"); api2Body.put("sourceFilterInfo", sourceList); api2Body.put("contextIds", new ArrayList<>()); // 3. 调用API2 RestAssured.given() .header("Content-Type", "application/json") .body(api2Body) .when() .post("你的API2接口地址") .then() .statusCode(200); // 按需补充API2的断言逻辑 } }
注意点
- 如果API1返回的列表可能为空,建议加非空判断再构造API2请求,避免异常
- 可以根据实际业务需求过滤userSourceMeta里的无效数据,比如sourceUserId为null的条目可以过滤后再塞入请求体
内容的提问来源于stack exchange,提问作者Shankar Daitha
相关产品推荐
相关产品推荐

