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]

posted @   懂得了才能做一些改变  阅读(9751)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示