Restful软件架构风格
Restful
概念
是软件的一种设计架构和设计风格,由http1.1开创者提出。rest中有一些约束条件和原则,符合这些约束的程序或设计就是restful
网络资源
- 在网络中一切皆资源,都有唯一的uri(统一资源定位符)进行定位,uri只表示一种资源,但并不代表资源的表现形式。在restful中,uri中只能有名词,不能有动词,且与数据库表名对应,且使用复数
旧方式
http://localhost/employee/delete?id=1
restful方式
//删除 注意提交方式是delete
http://localhost/employees/1
//查询所有 注意提交方式是get
http://localhost/employees
//查询id为1的员工 注意提交方式是get
http://localhost/employees/1
//新增 注意提交方式是post,需要提交参数
http://localhost/employees
//全部更新 注意提交方式是put,需要提供该员工的全部属性
http://localhost/employees/1
//局部更新 注意提交方式是patch,需要提供该员工的部分属性
http://localhost/employees/1
-
资源的表现形式在http请求头信息中
accept: application/json 代表浏览器希望服务器返回的数据格式,与后台produce对应
content-type: application/json 代表浏览器传给后台的数据格式,与后台consume对应 -
http1.1协议中的请求方法
- get
- post
- delete 删除时
- put 需要更新整个对象
- patch 对象中的部分属性更新
- head
- options
restful中常见状态码
- 200 ok [get] 通常是查询成功
- 201 created [post,put,patch] 通常用于新增或更改成功
- 204 no content [delete] 通常用于删除成功
- 400 invalid erquest 通常是浏览器发送的数据无法被controller转换接收,比如日期要指定pattern
- 405 Request method ‘xx’ not supported 后台要求的请求方法类型与前台传来的不一致
常用restful开发框架
主流SpringMVC,其余WebFlux,jersey,play
补充小bug:Springmvc返回json字符串时会出现中文乱码
- postmapping中指定produces = “application/json;charset=utf-8”
- 前端请求中指定Accept为application/json;charset=utf-8
- 在mvc.xml中添加响应格式转换器,不止可以指定json,text/html格式一样可以指定
<!--mvc注解解析器-->
<mvc:annotation-driven>
<!--json修改默认编码,否则中文乱码-->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
在SpringMVC中使用restful
以前无论什么请求都是使用RequestMapping注解,现在要窄化请求,常用5种RequestMapping子注解
//列举所有员工
@GetMapping("/employees")
//获取指定id的员工
@GetMapping("/employees/{id}")
//删除指定id的员工,删除通常返回状态码204
@DeleteMapping("/employees/{id}")
//新增员工
@PostMapping(path = "/employees")
//更新员工全部属性
@PutMapping(path = "/employees")
//更新员工部分属性
@PatchMapping(path = "/employees")
这些如果用@RequestMapping替代的话
@RequestMapping(path = "xx",method = RequestMethod.DELETE)
@RequestMapping注解的常用属性
- value/path 映射路径
- method 窄化请求,限定请求方式,只有对应的请求方式的请求才会被该方法处理
- headers 请求头中必须包含规定信息才能进入该方法
- params 请求中必须包含什么参数才会执行该方法,请求中的参数不仅要有而且非空
- consumes 消费,设置服务器接受的数据类型,与浏览器content-type一致,不是该类型无法进入
- produces 生产,设置服务器返回给浏览器的数据类型,与浏览器accept一致
在ajax使用restful
-
ajax默认不支持put和patch,因此web.xml需要配置HttpPutFormContentFilter过滤器
-
ajax中contentType用于设置请求数据类型,dataType用于期望服务器返回的数据类型
-
ajax发送纯json格式数据,需要注意不止要设置contentType: “application/json;charset=utf-8”,
在传送的data中要传json字符串JSON.stringify({“id”:1,“name”:‘chenjin’}),这样后台就可以使用@RequestBody接收json数据
在表单中使用restful
- 表单默认只支持post和get,因此web.xml配置HiddenHttpMethodFilter过滤器,然后设置隐藏域为真实的方法类型
<input type="hidden" name="_method" value="put"/>
为什么使用restful
-
后台提供的所有都是资源,因此统一资源定位符中应该出现的是名词,不应该有动词,那么动作如何规定,前台限制发送请求方法的类型比如post,get,delete,put…
后台每个方法需要对应相应的请求方法类型限制,比如@DeleteMapping -
适用于前后端分离,可以返回正确的状态码
推荐阅读
-
SAAS软件架构——数据层架构实践
-
Restful软件架构风格
-
软件架构师之概念架构
-
随笔-架构篇-软件架构
-
【转自phpchina】支付宝架构师对话腾讯研发总监 博客分类: 网站架构 腾讯互联网敏捷开发软件测试电子商务
-
使用MPICH构建一个四节点的集群系统 博客分类: 网站架构 应用服务器Linux网络应用电子商务软件测试
-
对《我的架构经验系列文章 - 前端架构》文章的评论回复 博客分类: 原创 前端架构软件工程模块化
-
对《我的架构经验系列文章 - 前端架构》文章的评论回复 博客分类: 原创 前端架构软件工程模块化
-
SpringMVC结合Ajax使用Restful风格实现前后端分离
-
软件架构与框架