restTemplate 使用问题小记

resttemplate,使用,问题,小记 · 浏览次数 : 66

小编点评

**REST Template 接口转发示例** ```java @RestController @RequestMapping("/api/forward") public class ForwardController { private RestTemplate restTemplate; public ForwardController(RestTemplate restTemplate) { this.restTemplate = restTemplate; } // 文件上传 @PostMapping(path = "/upload") public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { LinkedMultiValueMap params = new LinkedMultiValueMap<>(); params.add("file", file.getResource()); headers.add("Authorization", token); return restTemplate.postForEntity(new RequestEntity<>(params), null, 200); } // 预览和下载 @GetMapping("/{fileName}") public ResponseEntity previewDownload(@PathVariable String fileName) throws IOException { Object responseEntity = restTemplate.getForObject(new URI("path/to/file?name=" + fileName), Object.class); if (responseEntity instanceof HttpMessageNotWritableException) { return ResponseEntity.status(400).build(); } String content = new String(responseEntity.getBody(), StandardCharsets.UTF_8); return ResponseEntity.ok(content).build(); } // 读取字符串和 CSS/JS 文件 @GetMapping("/content") public ResponseEntity readContent() throws IOException { String content = restTemplate.getForObject(new URI("path/to/content"), String.class); if (content == null) { return ResponseEntity.notFound().build(); } return ResponseEntity.ok(content).build(); } } ``` **注释:** 1. `MultipartFile` 用于处理文件上传。 2. `Object` 用于接收响应实体,并支持多种数据类型。 3. `HttpMessageNotWritableException` 用于处理无法写入响应体的异常。 4. `JSONUtil` 用于转换字节数组到字符串。

正文

使用restTemplate在后端进行接口转发, 期间包括文件上传, 预览和下载. 还有一些字符串或css/js文件的读取.

1. 文件上传

参考: RestTemplate转发MultipartFile

LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("file", file.getResource());
// headers转发token等参数
// httpMethod 之前的请求方法
return new RequestEntity<>(params, headers, httpMethod, new URI(url));

2. 文件预览和下载

之前是使用Object接收
restTemplate.exchange(requestEntity, Object.class);
在返回文件和text时候会有HttpMessageNotWritableException异常
可参考: 被坑过后才知道学习HttpMessageConverter有多重要被坑過後才知道學習HttpMessageConverter有多重要 中的方式3.
或者使用byte[]接收
restTemplate.exchange(requestEntity, byte[].class);

3. 转发请求后的结果中添加内容(业务需求)

之前使用Object接收的话
Map<String, Object> resultMap = BeanUtil.beanToMap(responseEntity.getBody(), false, false);
如果使用byte[], 需要涉及到字节数组转对象, 其实需要字节转字符串, 再转对象即可
参考: java中字节数组与对象之间的转换
Map<Object, Object> resultMap = JSONUtil.toBean(new String(responseEntity.getBody()), Map.class);

与restTemplate 使用问题小记相似的内容: