WebClient上传xml文件必须显式设置Content-Type为application/xml或text/xml,否则服务端可能因类型不匹配(如text/plain)导致解析失败或415错误;本地文件推荐用MultipartBodyBuilder流式上传并保留文件名,字符串上传则需配合contentType方法指定类型且确保UTF-8编码一致。

WebClient 上传 XML 文件必须设置 Content-Type
spring 5 的 WebClient 默认不会自动推断 XML 文件的 Content-Type,如果只用 bodyValue(fileContent),服务端很可能收到 text/plain 或空类型,导致解析失败。必须显式指定为 application/xml 或 text/xml。
- XML 字符串体上传:用
bodyValue+contentType头 - 本地
.xml文件上传:推荐转为DataBuffer流式写入,配合MultipartBodyBuilder - 若后端是 Spring WebFlux 的
@RequestBody String xml接收,Content-Type: application/xml是硬性要求
用 MultipartBodyBuilder 上传 XML 文件(推荐)
这是最贴近真实“文件上传”语义的方式,尤其当后端期望接收 MultipartFile 或 multipart/form-data 格式时。注意:XML 文件名需保留(如 data.xml),否则部分服务端框架无法识别内容类型。
Path xmlPath = Paths.get("src/main/resources/test.xml"); String filename = xmlPath.getFileName().toString(); byte[] xmlBytes = Files.readAllBytes(xmlPath); MultipartBodyBuilder builder = new MultipartBodyBuilder(); builder.part("file", new ByteArrayResource(xmlBytes), MediaType.APPLICATION_XML) .filename(filename); WebClient.create() .post() .uri("https://api.example.com/upload") .bodyValue(builder.build()) .header(HttpHeaders.CONTENT_TYPE, builder.build().getHeaders().getContentType().toString()) .retrieve() .bodyToMono(String.class) .block();
直接传 XML 字符串(不走 multipart)
适用于后端接受裸 XML body(如 @RequestBody Document 或 String)。此时无需 multipart 封装,但必须确保:
-
Content-Type明确设为application/xml - XML 字符串本身格式合法(UTF-8 编码、无 bom、根元素闭合)
- 避免用
bodyValue(xmlString)后再手动加 header —— 应该用bodyValue配合contentType方法,否则 header 可能被覆盖
String xmlPayload = "123 "; WebClient.create() .post() .uri("https://api.example.com/submit") .contentType(MediaType.APPLICATION_XML) .bodyValue(xmlPayload) .retrieve() .bodyToMono(String.class) .block();
常见 415 错误和字符编码陷阱
返回 415 Unsupported Media Type 几乎全是 Content-Type 不匹配导致;而中文乱码或解析异常,则大概率是编码未对齐。Spring WebFlux 默认按 UTF-8 解析,但如果你的 XML 声明写了 encoding="GBK",又没做相应适配,就会出错。
- XML 文件读取时统一用
Files.readAllBytes(path)(字节安全),不要用Files.readString()再转回 bytes - 若 XML 带声明如
,确保实际字节流确实是 UTF-8 编码 -
WebClient不会重写 XML 声明,所以声明里的 encoding 和传输层 encoding 必须一致
multipart 边界生成、buffer 复用、响应式背压处理这些细节在简单上传中容易被忽略,但一旦并发量上来或文件变大,就可能卡在 DataBufferFactory 分配环节。