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

Spring Boot RestTemplate上传XML文件报415不支持媒体类型错误

Spring Boot调用XML接口返回415错误修复

问题场景

开发Spring Boot应用时,需要实现上传XML文件、调用第三方接口获取XML格式响应的功能,请求时持续返回415 Unsupported Media Type错误。

原有Controller代码

@PostMapping("/")
public String postIndex(@RequestParam("fisier") MultipartFile file) throws IOException {
    
String url = "http://xxx/FCTEL/rest/transformare/UBL";
URI uriLink = URI.create(url);
HttpHeaders headers = new HttpHeaders();
//headers.set("serial_certificate", serial);
RestTemplate restTemplate = new RestTemplate();
RestCall rc = new RestCall();
rc.body = new String(file.getBytes(), StandardCharsets.UTF_8);
RequestEntity<String> reqEntity = new RequestEntity<String>(rc.body, headers, HttpMethod.POST, uriLink);
String response = restTemplate.postForObject(uriLink, reqEntity, String.class);
System.out.println(response);
File f = new File(response);
    return "index";
}

报错信息

org.springframework.web.client.HttpClientErrorException$UnsupportedMediaType: 415 : " 
{"timestamp":"2022-07-05T05:39:01.445+00:00","status":415,"error":"Unsupported Media 
Type","path":"/FCTEL/rest/transformare/UBL"}"

故障定位代码行:

String response = restTemplate.postForObject(uriLink, reqEntity, String.class);

问题根因

  • 没有给请求设置正确的Content-Type头:第三方XML接口需要明确识别请求体是XML格式,原有代码创建的headers是空的,没指定媒体类型,服务端解析不了请求体直接返回415。
  • RestTemplate用法错误:postForObject方法不会解析RequestEntity里自带的请求方法、头信息,传这个对象进去会被当成普通请求体处理,配置完全不生效。

可直接运行的修复代码

@PostMapping("/")
public String postIndex(@RequestParam("fisier") MultipartFile file) throws IOException {
    String url = "http://xxx/FCTEL/rest/transformare/UBL";
    URI uriLink = URI.create(url);

    // 配置请求头
    HttpHeaders headers = new HttpHeaders();
    // 声明请求体是XML格式,这步是解决415的核心
    headers.setContentType(MediaType.APPLICATION_XML);
    // 声明期望接收XML格式的响应
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_XML));
    // 需要传自定义证书头就放开下面注释
    //headers.set("serial_certificate", serial);

    // 读取上传的XML文件内容作为请求体
    String xmlContent = new String(file.getBytes(), StandardCharsets.UTF_8);
    // 构造正确的请求实体,不要用RequestEntity搭配postForObject
    HttpEntity<String> request = new HttpEntity<>(xmlContent, headers);

    RestTemplate restTemplate = new RestTemplate();
    // 用exchange方法发请求,会完整携带你配置的头信息
    ResponseEntity<String> resp = restTemplate.exchange(
            uriLink,
            HttpMethod.POST,
            request,
            String.class
    );

    String responseXml = resp.getBody();
    System.out.println(responseXml);
    // 注意:原代码直接把接口返回内容当文件路径创建File是逻辑bug,后续文件存储要写真实的本地路径,不要直接用响应内容当路径
    // File saveFile = new File("你的实际文件存储路径");

    return "index";
}

适配特殊场景的调整方案

  • 如果改完还是报415,把MediaType.APPLICATION_XML换成MediaType.TEXT_XML试试,不少老旧XML接口只认text/xml类型。
  • 如果第三方接口要求用multipart表单形式上传XML文件(和你自己接口接收MultipartFile的逻辑一致),就把Content-Type改成MediaType.MULTIPART_FORM_DATA,把XML文件封装到MultiValueMap里传参即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:45:32