对于后端开发人员来说,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数据。