MultipartFile 在 RestTemplate 中失败,错误请求 400 无正文

MultipartFile failed in RestTemplate with - Bad Request 400 No body

方法详情如下:

  1. 我的 Web 应用程序将获取该文件。
  2. 上传文件后,在服务器端以MultipartFile的形式接收。
  3. 我会按原样发送到另一个服务。 (作为一个 MultipartFile)。

我正在将多部分文件对象传递给另一个 rest api 服务。这是代码。(HTTP方法是POST,url是“/uploadDocument”)

public ResponseEntity<String> executeMultipartRequest(String url, HttpMethod method, MultipartFile obj){
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        requestHeaders.add("Accept", MediaType.APPLICATION_JSON_VALUE);
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        body.add("file", obj.getResource());
        HttpEntity<?> requestEntity = new HttpEntity<>(body, requestHeaders);
        return restTemplate.exchange(url, method, requestEntity, String.class);
    }

这是我从上面的方法调用中调用的服务:

@PostMapping(value = "/uploadDocument", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("userName") String userName) {
        return null; // removed actual code. 
    }

但是当我执行该方法时出现以下错误:

org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/attest] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [no body]] with root cause org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [no body]

知道问题到底是什么吗?

我也想知道,这个做法对吗?

需要任何更改吗?

有什么建议吗?

谢谢,

阿图尔

我可以通过 rest 发送 MultipartFile 对象 api。

这些是我对问题中提到的现有代码所做的更改。

这是工作代码:

public ResponseEntity<String> executeMultipartRequest(String url, HttpMethod method, Object obj, Map<String, String> dataMap){
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        requestHeaders.setCacheControl(CacheControl.noCache());
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        ContentDisposition contentDisposition = ContentDisposition.builder("form-data")
            .name("file")
            .filename(((MultipartFile)obj).getOriginalFilename())
            .build();
        body.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
        body.add("file", ((MultipartFile)obj).getResource());
        body.add("Content-Type", ((MultipartFile)obj).getContentType());
        addData(body, dataMap);
        HttpEntity<?> requestEntity = new HttpEntity<>(body, requestHeaders);
        logger.debug("executeMultipartRequest => before executing rest api request.");
        return restTemplate.exchange(url, method, requestEntity, String.class);
    }

private void addData(MultiValueMap<String, Object> body, Map<String, String> dataMap) {
        if(!dataMap.isEmpty()){
            dataMap.forEach((key, value) -> body.add(key, value));
        }
    }   

我应用的解决方案是通过将文件添加到 ContentDisposition 中将其作为表单数据发送。

设置所需的属性。

终点url与题中所述相同