如何在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
相关产品推荐
相关产品推荐

