Rest Assured多部件POST请求:如何封装表单参数为嵌套对象
在Rest Assured中发送嵌套结构的多部件请求(含视频文件)
首先得明确一个关键点:如果要在请求里包含二进制文件(比如你的视频),是没办法用纯application/json格式的——JSON本身不支持直接嵌入二进制数据,必须用multipart/form-data类型的请求。你之前用formParam和multiPart能正常运行,本质上就是用了这种多部件格式,现在要做的是把参数封装成嵌套的sample对象,其实只需要调整参数的命名方式或者用Rest Assured的参数前缀功能就行。
方案1:使用参数前缀(最简洁)
Rest Assured提供了paramPrefix方法,可以给所有表单参数统一添加前缀,这样就能轻松构造出嵌套的结构:
given() .header("Accept", "application/json") .header(auth) .config(rConfig) .paramPrefix("sample") // 给所有后续表单参数加上sample前缀 .formParam("name", "Video Upload") // 实际发送的参数名是sample[name] .formParam("kind", "upload") // 实际发送的参数名是sample[kind] .multiPart("video_file", new File("path"), "video/mp4") // 对应sample[video_file] .log().all() .expect() .statusCode(expectedStatusCode) .post(url);
这种方式下,后端会自动把这些参数解析成你需要的嵌套结构:
{"sample": {"name": "Video Upload", "kind": "upload", "video_file": [视频文件]}}
方案2:手动指定嵌套参数名
如果你不想用前缀,也可以直接在参数名里写嵌套路径,和你之前的写法类似,但更统一:
given() .header("Accept", "application/json") .header(auth) .config(rConfig) .multiPart("sample[name]", "Video Upload") .multiPart("sample[kind]", "upload") .multiPart("sample[video_file]", new File("path"), "video/mp4") .log().all() .expect() .statusCode(expectedStatusCode) .post(url);
关于application/json的补充说明
如果你的后端非要接收application/json格式,那只能把视频文件转换成Base64编码后嵌入JSON,但非常不推荐这么做:
- 视频文件体积大,Base64会让体积再增加30%左右,严重影响请求性能
- 后端处理Base64编码的文件也会更麻烦,需要额外解码步骤
所以优先选择multipart/form-data的方案,这也是文件上传的标准做法。
内容的提问来源于stack exchange,提问作者ARods
相关产品推荐
相关产品推荐

