根本原因是请求头未正确设置 content-type 为 application/xml,导致服务端无法识别 xml 数据类型而返回 415 错误。

为什么 XML 文件上传返回 415 Unsupported Media Type
服务端拒绝接收 XML 数据,根本原因几乎总是请求头里没带或写错了 Content-Type。不是文件内容有问题,是“信封”贴错了标签——HTTP 协议靠这个字段告诉后端“我发的是什么”,后端据此决定要不要接、用哪个解析器处理。
常见错误现象:fetch 或 axios 直接传 File 或 Blob 对象,但没显式设置 Content-Type;或者设成了 text/xml(部分框架不认);又或者用了 FormData 却把 XML 当文本塞进去,导致自动变成 multipart/form-data,而接口只接受纯 XML。
- Spring Boot 默认只接受
application/xml,不认text/xml - ASP.NET Core 也默认要求
application/xml,且需启用 XML 输入格式化器 - Node.js + Express 需要
body-parser的xmlParser中间件,且配置中必须允许该类型
fetch 上传 XML 时怎么设对 Content-Type
别依赖浏览器自动推断,必须手动指定。XML 文件对象(File)本质是 Blob,直接作为 body 发送即可,不需要包装成 FormData。
正确做法是:读取文件为 ArrayBuffer 或保持 File 原样,显式传入 headers,且 Content-Type 必须是 application/xml。
- 用
File对象直传(推荐):fetch('/api/import', { method: 'POST', headers: { 'Content-Type': 'application/xml' }, body: file // file 是 input[type="file"].files[0] }); - 若需预处理(如加根节点),用
new Blob([str], {type: 'application/xml'})构造后再传 - 绝对不要用
FormData.append('file', file)—— 这会强制变成multipart,触发 415
后端 Spring Boot 怎么支持 application/xml 解析
Spring 默认禁用 XML 请求体解析,即使你写了 @RequestBody MyXmlDto,没配解析器也会直接 415。
关键在两处:一是添加 Jackson XML 支持依赖,二是启用 WebMvcConfigurer 的 XML 消息转换器。
- Maven 加依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
- 配置类里注册
Jackson2ObjectMapperBuilder并启用XmlMapper - 确保 Controller 方法参数标注了
@RequestBody,且类上有@JacksonXmlRootElement(如果用 Jackson XML) - 检查是否误加了
@EnableWebMvc—— 它会覆盖默认配置,导致 XML 支持被清空
用 curl 测试时最容易漏的三个点
本地调试最常用 curl,但 415 错误往往卡在这几个细节上,不是后端没跑起来,是请求本身就不合规。
- 必须加
-H "Content-Type: application/xml",少一个字母都不行 - 文件路径要用
@符号:正确是-d "@data.xml",写成-d "data.xml"就是传字符串字面量 - 如果 XML 内容含特殊字符(比如
&、),别直接内联写在命令里,一律用文件方式传,避免 shell 解析干扰
真正麻烦的从来不是写代码,是前后端对“XML 该长什么样”没对齐——比如一方认为 text/xml 合法,另一方只认 application/xml;或者前端用 FormData 包了一层,后端却等着裸 XML 流。这种隐性约定,比语法错误更难定位。










