RestAssured发送multipart请求时JSON字段重复引号导致请求失败
问题根因
请求失败的核心原因不是curl日志里显示的双引号重复——那个双写双引号是curl日志工具为适配Windows命令行规则做的转义展示,不是实际HTTP请求传输的内容。真正的问题出在multiPart方法的默认行为上:
- 你调用的两参重载
.multiPart("information", "{\"description\":\"info\"}"),会被RestAssured默认识别为文件类part,自动在Content-Disposition头中追加filename=file字段,同时将该part的Content-Type默认设为text/plain。 - 绝大多数后端multipart解析逻辑,只要识别到part带
filename属性,就会将其作为文件流处理,不会读取流内容做JSON反序列化,因此返回“information字段不是合法对象类型”的错误。 - 你配置的UTF-8字符集未生效,也是因为默认文件类part的字符集优先级高于全局配置,日志里显示的
charset=ISO-8859-1就是佐证。 - Postman调用能成功,是因为Postman中手动选择Text类型的表单项时,不会自动追加
filename头,后端会将其作为普通表单字段解析。
解决方案
按优先级选以下任意一种即可:
方案1:指定part的MIME类型(最小改动)
将information字段的multiPart调用改为三参重载,明确指定MIME类型为application/json,RestAssured就不会自动追加filename头:
.multiPart("information", "{\"description\":\"info\"}", "application/json")
如果改完后日志里仍然存在filename=file,则用MultiPartSpecBuilder显式置空filename:
.multiPart(new MultiPartSpecBuilder("{\"description\":\"info\"}") .controlName("information") .mimeType("application/json") .charset(StandardCharsets.UTF_8) .fileName(null) .build())
方案2:全局配置默认去掉filename头(适合项目统一规范)
修改你的RestAssuredConfig配置,全局设置默认文件名为null,同时指定默认字符集,后续所有非文件类part都不会自动追加filename头:
RestAssuredConfig config = CurlLoggingRestAssuredConfigFactory.createConfig(options) .multiPartConfig(MultiPartConfig.multiPartConfig() .defaultCharset(StandardCharsets.UTF_8) .defaultFileName(null) );
配置完成后原有两参的multiPart写法可以正常使用,不需要额外修改。
方案3:直接传序列化对象(避免手动拼JSON转义问题)
不需要手动拼接JSON字符串,直接传对应结构的Java对象,RestAssured会自动完成序列化:
// 先定义对应结构的POJO,可手动写getter/setter或用Lombok注解 class Information { private String description; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } // 构造参数 Information info = new Information(); info.setDescription("info"); // 传参 .multiPart("information", info, "application/json")
验证方式
修改完成后查看RestAssured自带的请求日志,information对应的part满足以下特征即为正确:
Content-Disposition头中只有name="information",没有filename=xxx字段Content-Type为application/json; charset=UTF-8- 内容显示为
{"description":"info"}
此时发起请求即可正常返回201状态码。
内容的提问来源于stack exchange,提问作者user3670127
相关产品推荐
相关产品推荐

