Spring 启动 - restTemplate.postForObject - 参数为空
Spring boot - restTemplate.postForObject - params are null
我有 2 个 spring 引导应用程序 运行 一个作为前端服务,另一个作为后端服务。我从前端对后端服务进行 api 调用,我发送的两个参数都显示为空。我认为问题出在其余模板中。
更新
所以我注意到,如果我省略内容值,它就会起作用。由于内容是大于 1mb 的文件的内容,我将以下内容添加到 application.yml:
spring.servlet.multipart.max-file-size: 10MB
spring.servlet.multipart.max-request-size: 10MB
这是我根据本期发布的代码更新的代码:
但是我仍然没有得到后端控制器中的值,而是两个值都是空的。
public void upload(byte[] content, String name) {
String encodedString = Base64.getEncoder().encodeToString(content);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("fileName", name);
map.add("content", encodedString);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
log.debug("Response from upload: " + response);
}
这是后端的控制器。 fileName 和 content 均为空:
@CrossOrigin
@SneakyThrows
@ResponseBody
@PostMapping(value = "/upload")
public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
byte[] decodedBytes = Base64.getDecoder().decode(form.getContent());
uploadService.upload(decodedBytes, form.getFileName());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Content-Type", "application/json");
return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
}
任何人都可以看看这段代码有什么问题吗?
提前致谢。
我想问题是您正在尝试使用 restTemplate.postForObject
但使用 @RequestParam
而不是 @RequestBody
.
在 @RequestParam
中,您希望在查询参数 /upload?fileName=&content=
中接收到数据。但是您实际上是在 restTemplate.postForObject(backendService+ "/upload", map, String.class);
.
正文中发送它
所以我的建议是改
public ResponseEntity<String> upload(@RequestParam(value = "fileName") String fileName, @RequestParam(value = "content") String content)
到
public ResponseEntity<String> upload(@RequestBody Map<String, String> body)
然后从正文中获取文件名和文件内容。
好的,我可以通过发送和接收字节而不是编码为字符串的字节来修复它。
所以在resttemplate中:
public void upload(byte[] bytes, String name) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("fileName", name);
map.add("bytes", bytes);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
log.debug("map values: " + map.toString());
ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
log.debug("Response from upload: " + response);
}
在控制器中:
public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
byte[] bytes = form.getBytes();
uploadService.upload(bytes, form.getFileName());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Content-Type", "application/json");
return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
}
不过,如果知道为什么以前的版本不起作用,那将是一件好事。
我有 2 个 spring 引导应用程序 运行 一个作为前端服务,另一个作为后端服务。我从前端对后端服务进行 api 调用,我发送的两个参数都显示为空。我认为问题出在其余模板中。
更新
所以我注意到,如果我省略内容值,它就会起作用。由于内容是大于 1mb 的文件的内容,我将以下内容添加到 application.yml:
spring.servlet.multipart.max-file-size: 10MB
spring.servlet.multipart.max-request-size: 10MB
这是我根据本期发布的代码更新的代码:
但是我仍然没有得到后端控制器中的值,而是两个值都是空的。
public void upload(byte[] content, String name) {
String encodedString = Base64.getEncoder().encodeToString(content);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("fileName", name);
map.add("content", encodedString);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
log.debug("Response from upload: " + response);
}
这是后端的控制器。 fileName 和 content 均为空:
@CrossOrigin
@SneakyThrows
@ResponseBody
@PostMapping(value = "/upload")
public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
byte[] decodedBytes = Base64.getDecoder().decode(form.getContent());
uploadService.upload(decodedBytes, form.getFileName());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Content-Type", "application/json");
return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
}
任何人都可以看看这段代码有什么问题吗?
提前致谢。
我想问题是您正在尝试使用 restTemplate.postForObject
但使用 @RequestParam
而不是 @RequestBody
.
在 @RequestParam
中,您希望在查询参数 /upload?fileName=&content=
中接收到数据。但是您实际上是在 restTemplate.postForObject(backendService+ "/upload", map, String.class);
.
所以我的建议是改
public ResponseEntity<String> upload(@RequestParam(value = "fileName") String fileName, @RequestParam(value = "content") String content)
到
public ResponseEntity<String> upload(@RequestBody Map<String, String> body)
然后从正文中获取文件名和文件内容。
好的,我可以通过发送和接收字节而不是编码为字符串的字节来修复它。 所以在resttemplate中:
public void upload(byte[] bytes, String name) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("fileName", name);
map.add("bytes", bytes);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
log.debug("map values: " + map.toString());
ResponseEntity<String> response = restTemplate.postForEntity(backendUrl + "/upload", request, String.class);
log.debug("Response from upload: " + response);
}
在控制器中:
public ResponseEntity<String> upload(@ModelAttribute FormModel form) {
byte[] bytes = form.getBytes();
uploadService.upload(bytes, form.getFileName());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Content-Type", "application/json");
return ResponseEntity.ok().headers(responseHeaders).body("Uploaded");
}
不过,如果知道为什么以前的版本不起作用,那将是一件好事。