繁体   English   中英

多部分文件在 RestTemplate 中失败 - 错误请求 400 没有正文

[英]MultipartFile failed in RestTemplate with - Bad Request 400 No body

以下是方法细节:

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

我将多部分文件 object 传递给另一个 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 调用严重:Servlet.service() for servlet [dispatcher] in context with path [/attest] throw exception [Request processing failed; 嵌套异常是 org.springframework.web.client.HttpClientErrorException$BadRequest: 400: [no body]] 根本原因 org.springframework.web.client.HttpClientErrorException$BadRequest: 400: [no body]

知道问题到底是什么吗?

我也想知道,方法正确吗?

需要什么改变吗?

有什么建议么?

谢谢,

阿图尔

我可以通过 rest api 发送 MultipartFile object。

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

这是工作代码:

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 与问题中提到的相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM