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
相关产品推荐
相关产品推荐

