RestTemplate及Response文件流问题
对于后端开发人员来说,Spring大大地方便了我们写接口和调接口。写接口可以使用@RestController,@RequestParam,@PathVariable等注解,调接口就使用RestTemplate对象。
注解原理上是使用了HttpMessageConverter,可以完成pojo<-->josn的转换。比如controller中的@RequestBody中使用List<String>,Map<String,Object>,可以自动转换为Json。
下面分析RestTemplate使用,RestTemplate主要有如下方法:
xxxForEntity(url,obj,param);
xxxForObject(url,param,T.class);
区别在于返回类型不一样,一个是ResponseEntity,一个是ResponseData,显然,ResponseEntity更加的具体。
要注意的是,RestTemplate中get方法不能传递Header,如何有Header,则要使用exchange方法,否则会犯一个很隐蔽的错误。通常,如果对方传递的既有Json字段,又有二进制文件流,如何接收呢?
postEntity(url,param,Resource.class)
// 重点是这个Rescue,可以读取的对象
----------------2019/10/9-----在公司使用写了两个微服务,总结一下-------
1.文件流作为一种特殊的数据格式,不能和普通的json对象一样返回。那么返回文件流通常有两种方法A.直接返回FileSystemResource,B.使用HttpServletResponse作为输出流,向里面写入数据。两种方法各有优点,
A简单,但是应为返回的是FileSystemResource,所以在方法返回前会一直占用File对象,无法在方法中进行删除文件操作。B方法稍微琐碎一点,但是可以在把文件流写入网络后,对磁盘上的文件进行操作,灵活性更强。
同时,作为返回文件流,在异常情况下是很难返回自定义的具体错误信息的。应为返回自定义错误信息httpstatus也是200,和文件流的正确情况无法区分。所以想要具体的错误信息,一般要分离一个接口,
就是查询文件的状态,当确定文件资源存在时,调用获取文件借口获取。同时使用outputStream时,就无法写入状态码。
2.控制器异常处理。首先我们服务里自定义的异常都本是HttpStatus=200,否则我们无法返回错误信息。区分HttpStatus和我们自定义的状态码。这两个其实什么关系都没有,不应该搞混。可能HttpStatus中返回200,但是我们自定义的却返回404。设置HttpStatus可以使用ResponseEntity或者Response对象。虽然有spring中有ExceptionHandler,但是并不好用。
------------------------2022---------------
在开发中,前端需要传入表单,这个表单中既有json数据,又有文件。怎么办呢?我们不能使用File对象,都传递给后端。这时就要认识到File对象特殊性了。它是一种二进制文件,是非结构数据。这时我们可以将其分开。
先让用户上传文件,然后返回uuid,然后前端就关联上,这样还是很优雅的。
当我们使用RestTemplate接收文件时,其返回类型可以是byte[],并不说Rest只能传递json数据。
参考博文:
(spring中@RequestBody和@RequestParam的注意事项)[https://blog.csdn.net/xixingzhe2/article/details/84070756]
日进有功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?