You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:06:01