put请求必须设置content-type: application/xml,否则服务端常返回400或415;需配合utf-8编码、正确etag校验及spring boot的xml反序列化模块配置。

PUT 请求必须带 Content-Type: application/xml
不设这个头,服务端大概率直接拒绝,返回 400 Bad Request 或 415 Unsupported Media Type。很多客户端(比如 curl、Postman)默认不设,或者误设成 text/xml——虽然部分服务能容忍,但 Restful 规范推荐用 application/xml。
实操建议:
- 用 curl 时务必加
-H "Content-Type: application/xml" - JavaScript 的
fetch()要在headers里显式写入,不能依赖自动推断 - Spring Boot 等后端框架若用
@RequestBody接收,底层依赖这个 header 去触发 XML 反序列化,设错就进不到业务逻辑
cURL 上传 XML 文件的最小可行命令
直接读文件发 PUT,是最常见也最容易出错的操作。核心是别漏掉 -X PUT 和 --data-binary(不是 --data)。
常见错误现象:XML 中的换行或特殊字符被转义、空格被截断、中文变乱码。
正确写法:
curl -X PUT \ -H "Content-Type: application/xml" \ --data-binary "@config.xml" \ https://api.example.com/v1/resources/123
-
@config.xml前必须有@,否则传的是字面字符串@config.xml,不是文件内容 - 用
--data-binary保证原始字节不被修改;--data会做 URL 编码,破坏 XML 结构 - 如果 XML 含中文,确保文件本身是 UTF-8 编码,且 XML 声明里写
<?xml version="1.0" encoding="UTF-8"?>
Java HttpClient 发送 XML PUT 的关键配置
Apache HttpClient 或 Java 11+ HttpClient 默认不处理 XML,容易忽略字符编码和连接复用问题。
实操要点:
- body 必须用
StringBody(Apache)或HttpRequest.BodyPublishers.ofString()(Java 11+),并指定UTF-8字符集 - 别用
URLEncoder.encode()包裹整个 XML 字符串——那是给 form 表单用的,会把变成 <code>%3C - 设置
Connection: close头有时能绕过某些代理对 XML 流的提前截断(尤其老 Nginx 配置) - 如果服务端返回
409 Conflict,大概率是 ETag 校验失败,需先 GET 资源拿到ETag头,再在 PUT 里带上If-Match
Spring Boot Controller 接收 XML PUT 的注意事项
后端没配好,前端再规范也没用。Spring 默认只支持 JSON,XML 需额外激活,且容易因包冲突导致解析静默失败。
必须检查:
- 项目里要有
spring-boot-starter-web+jackson-dataformat-xml或org.dom4j:dom4j(推荐前者) - Controller 方法参数要加
@RequestBody,且类上得有@XmlRootElement或用@JacksonXmlRootElement - 如果 XML 顶层是
<root><item>...</item></root>,但 Java 类叫Config,没配@JacksonXmlRootElement(localName = "root")就会反序列化为空 - 日志里出现
HttpMessageNotReadableException,八成是 Jackson 找不到合适的 XML 模块,而不是 XML 内容错










