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

如何在Rest Assured中构造包含混合类型数组的请求Payload

如何在Rest Assured中构造包含混合类型数组的请求Payload

我明白你现在的困扰——你需要构造的images数组是混合类型的,里面既有{name: "aaa", job: "dev"}这样的对象,又有纯字符串格式的URL。而Java的泛型List只能存放单一类型的元素,所以用常规的List<Images>肯定没法精准还原这个Payload结构。下面我给你两种实用的解决方案:

方案一:使用List<Object>修改POJO结构

我们可以把pojoimage类里的images字段改成List<Object>,这样就能同时存放自定义对象和字符串了。具体修改步骤如下:

1. 修改pojoimage.java类

把原来的List<Images> images替换成List<Object> images,对应的getter和setter也要同步修改:

import java.util.List;

public class pojoimage {
    public String id;
    public String title;
    public String description;
    public String price;
    public List<Object> images; // 改成List<Object>

    // 以下getter和setter同步更新类型
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }
    public String getPrice() { return price; }
    public void setPrice(String price) { this.price = price; }
    public List<Object> getImages() { return images; }
    public void setImages(List<Object> images) { this.images = images; }
}

2. 修改Images.java类(移除多余的url字段)

你原来的Images类里多了url字段,这和目标Payload结构不符,需要删掉:

public class Images {
    public String name;
    public String job;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getJob() { return job; }
    public void setJob(String job) { this.job = job; }
}

3. 更新测试代码

现在可以直接把Images对象和URL字符串都添加到List<Object>里:

import org.testng.annotations.Test;
import static io.restassured.RestAssured.*;
import java.util.ArrayList;
import java.util.List;

public class PostDataWithoutSerial {

    @Test
    public void postRequestWithoutSerial() {
        pojoimage p1 = new pojoimage();
        Images i1 = new Images();
        List<Object> imgList = new ArrayList<>(); // 用List<Object>存储混合类型

        // 设置主对象字段
        p1.setTitle("iPhone 9");
        p1.setDescription("An apple mobile which is nothing like apple");
        p1.setPrice("549");
        p1.setId("1");

        // 设置Images对象并加入数组
        i1.setName("aaa");
        i1.setJob("dev");
        imgList.add(i1);

        // 添加URL字符串到数组
        imgList.add("https://i.dummyjson.com/data/products/1/1.jpg");
        imgList.add("https://i.dummyjson.com/data/products/1/2.jpg");

        // 把混合类型数组设置到主对象
        p1.setImages(imgList);

        given().log().all()
                .contentType("application/json")
                .body(p1)
                .when()
                .post("http://localhost:3000/products")
                .then()
                .statusCode(201);
    }
}

方案二:直接用HashMap组装Payload(无需POJO)

如果觉得POJO修改起来麻烦,也可以直接用HashMap和ArrayList手动构建整个JSON结构,这种方式更灵活,特别适合混合类型的场景:

import org.testng.annotations.Test;
import static io.restassured.RestAssured.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class PostDataWithoutSerial {

    @Test
    public void postRequestWithHashMap() {
        // 构建images数组内容
        ArrayList<Object> imagesList = new ArrayList<>();

        // 添加name和job的对象
        Map<String, String> imageObj = new HashMap<>();
        imageObj.put("name", "aaa");
        imageObj.put("job", "dev");
        imagesList.add(imageObj);

        // 添加URL字符串
        imagesList.add("https://i.dummyjson.com/data/products/1/1.jpg");
        imagesList.add("https://i.dummyjson.com/data/products/1/2.jpg");

        // 构建整个请求Payload
        Map<String, Object> payload = new HashMap<>();
        payload.put("id", 1);
        payload.put("title", "iPhone 9");
        payload.put("description", "An apple mobile which is nothing like apple");
        payload.put("price", 549);
        payload.put("images", imagesList);

        given().log().all()
                .contentType("application/json")
                .body(payload)
                .when()
                .post("http://localhost:3000/products")
                .then()
                .statusCode(201);
    }
}

补充:原代码的核心问题

你原来的代码把URL放到了Images对象的url字段里,这会生成嵌套的JSON结构,和目标Payload完全不符。目标Payload里的URL是直接作为数组元素存在的,不是嵌套在对象里的,这是导致无法还原结构的关键原因。

备注:内容来源于stack exchange,提问作者visha rathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:48:00