Rest (Representational Stat Transer) 是一种软件架构风格.
基础理论
架构特性
- 性能
- 可伸缩
- 简化的统一接口
- 按需修改
- 组件通信透明
- 可移植
- 可靠性
架构约束
- C/S 结构
- 无状态: Stateless
- 可缓存
- 分层系统
- 按需编码
- 统一接口: URI , 自描述消息(MIME),超媒体作为应用状态引擎(HATEOAS)
WEB MVC
MVC 中 URL 与 HTTP 方法的联系
URL 和 HTTP 方法存在联系. 不同方法对应的不同状态, 比如: https://api.exaple.com/resources/
使用GET方法为查询, PUT为替换文件, POST为创建,DELETE 为删除.
其中GET请求为安全方法, 多次请求结果一致. POST 为非幂等请求, 多次提交会创建多个, DELETE,PUT为幂等请求. 幂等性是服务端的实现, 符合幂等性的方法实现更安全.
MVC 中的媒体类型MIME
通过请求头中的Accept获取媒体类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
下面的方法用来添加默认的消息转化器:
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addDefaultHttpMessageConverters()
对于json, 可以找到转化器名称为MappingJackson2HttpMessageConverter
, 其中(可能是父类)定义的 read()
和 write()
方法用来读写数据.
同时也要注意canRead()
和 canWrite()
方法, 在相关的processor中, 通过遍历MessageConverters的List并调用can*
方法来确定是否应用消息转化器, 找到第一个匹配的就停止遍历了. 因此消息转化器的顺序至关重要.
自定义MessageConverter
- 扩展
AbstractHttpMessageConverter
抽象类, 并实现其中方法
public class Properties2HttpMessageConverter extends AbstractHttpMessageConverter {
// 注意此处, 设置父类接受的mime
public Properties2HttpMessageConverter(){
super(MediaType.valueOf("application/my+format"));
}
// 支持的POJO类型
@Override
protected boolean supports(Class clazz) {
return clazz.isAssignableFrom(MyObject.class);
}
@Override
protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
...
}
@Override
protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
...
}
}
- 添加配置并将自定义的消息转化器添加到列表实现接口
WebMvcConfigurer
实现方法extendMessageConverters()
- 在controller的方法上添加
@PostMapping(produces="application/my+format)
这个produers对应header的Accept
. 是我们自定义的MIME格式.