MultipartFile 在 RestTemplate 中失败,错误请求 400 无正文
MultipartFile failed in RestTemplate with - Bad Request 400 No body
方法详情如下:
- 我的 Web 应用程序将获取该文件。
- 上传文件后,在服务器端以MultipartFile的形式接收。
- 我会按原样发送到另一个服务。 (作为一个 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与题中所述相同
方法详情如下:
- 我的 Web 应用程序将获取该文件。
- 上传文件后,在服务器端以MultipartFile的形式接收。
- 我会按原样发送到另一个服务。 (作为一个 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与题中所述相同