XML作为请求体发送 Content-Type应该设置为什么

10次阅读

Content-Type 应设为 application/xml;必须与 XML 声明中的 encoding 一致(推荐 UTF-8),且 spring Boot 需额外添加 JAXB 依赖并配置 HttpMessageConverter,否则易触发 415 错误。

XML作为请求体发送 Content-Type应该设置为什么

Content-Type 应该设为 application/xml

发送 XML 作为请求体时,Content-Type 必须明确告知服务端载荷是 XML 格式。标准且最通用的取值是 application/xml

虽然 text/xml 在历史上也被支持,但现代 API 设计和主流框架(如 spring boot、ASP.net Core、express + body-parser)默认只识别 application/xml;用 text/xml 可能导致解析失败或 415 Unsupported Media Type 错误。

  • application/xml:RFC 7303 推荐,语义上表示“不可直接渲染的结构化数据”,适用于 API 场景
  • text/xml:旧规范遗留,部分老系统可能仍接受,但不推荐新项目使用
  • 带字符集声明时写成 application/xml; charset=utf-8,注意 charset= 后必须与 XML 声明中一致(如

常见错误:XML 声明编码与 Content-Type 不匹配

即使设置了 application/xml; charset=utf-8,如果 XML 正文开头写了 ,多数解析器会优先按 XML 声明解码,导致乱码或解析中断。

  • 统一用 UTF-8:XML 声明里写 encoding="UTF-8"Content-Type 也写 charset=utf-8
  • 不要省略 XML 声明——某些解析器(如 javaDocumentBuilder)在无声明时可能默认用系统编码,行为不可控
  • 后端是 Spring mvc,还需确认 @RequestBody 方法参数有对应 HttpMessageConverter(如 Jaxb2RootElementHttpMessageConverter),否则 415 仍会出现

curl 和 Axios 中的实际设置示例

命令行或前端发请求时,不能只靠数据格式自动推断类型,必须显式设置头。

curl -X POST https://api.example.com/data    -H "Content-Type: application/xml; charset=utf-8"    -d 'Alice'
axios.post('/data', 'Alice', {   headers: {     'Content-Type': 'application/xml; charset=utf-8'   } })

Spring Boot 默认不支持 XML?得手动配

Spring Boot 2.3+ 默认移除了 JAXB 依赖,即使 Content-Type 设置正确,也会因缺少转换器返回 415。

  • 加依赖:org.springframework.boot:spring-boot-starter-web + javax.xml.bind:jaxb-api(Java 8)或 org.glassfish.jaxb:jaxb-runtime(Java 11+)
  • 确保启动类或配置类上有 @EnableWebMvc 或启用默认 MVC 配置(通常已有)
  • 检查日志是否出现 No HttpMessageConverter for class XXX —— 这是典型缺失转换器信号

XML 的 Content-Type 看似简单,但实际踩坑多集中在编码一致性、框架默认支持变化、以及服务端解析器对 MIME 类型的严格程度上。别只改 header,XML 内容本身和后端环境都得同步对齐。

text=ZqhQzanResources