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

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满足以下特征即为正确:

  1. Content-Disposition头中只有name="information",没有filename=xxx字段
  2. Content-Type为application/json; charset=UTF-8
  3. 内容显示为{"description":"info"}

此时发起请求即可正常返回201状态码。

内容的提问来源于stack exchange,提问作者user3670127

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:42:08