使用RestTemplate调用文件上传API时遇400错误,求解决方案
解决RestTemplate调用PUT Multipart API报400的问题
以下是针对性的排查和修复步骤:
不要手动设置Content-Type头
手动指定MediaType.MULTIPART_FORM_DATA会丢失自动生成的boundary分隔符,服务端无法正确解析多部分请求。直接移除手动设置的Content-Type,RestTemplate会自动生成符合规范的请求头。为ByteArrayResource设置文件名
多数服务端依赖Multipart文件的文件名信息完成解析,创建ByteArrayResource时必须指定文件名:ByteArrayResource resource = new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); // 传入实际文件名 } };确保参数名与接口完全匹配
检查MultiValueMap中使用的参数键,是否和Postman调用时的参数名完全一致(比如Postman里的参数是不是"image"),大小写、拼写都不能出错。配置正确的RestTemplate转换器
默认RestTemplate的转换器配置可能存在问题,手动添加Multipart相关转换器:RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MultipartFormHttpMessageConverter()); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());对比请求头差异
用日志工具打印代码生成的完整请求头,和Postman的请求头逐一对比,重点核对:- Authorization头是否正确携带Bearer Token
- 是否存在多余的请求头(比如Accept头是否和Postman一致)
完整示例代码
// 构建请求体 MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("image", new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); } }); // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth("你的Token"); // 此方法更规范可靠 // 构建请求实体 HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); // 初始化并配置RestTemplate RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MultipartFormHttpMessageConverter()); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); // 发起PUT请求 ResponseEntity<String> response = restTemplate.exchange( "目标API地址", HttpMethod.PUT, requestEntity, String.class );
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

