REST首次出现在 2000 年 Roy Fielding 的博士论文中的一种软件架构风格。可以降低开发的复杂性,提高系统的可伸缩性。
一、资源
REST中可以命名的任何信息都可以是资源,如user、order等,通常表示Web服务中要操作的一个实体。一个资源具有统一的URI,通过URI能够标识并访问资源。
二、REST约束
REST定义了6个约束,符合这些约束的web服务才能成为REST风格的服务。
1.客户端—服务器
服务端与客户端独立实现并独立开发,只要接口不改变即可。提高跨多个平台的用户接口的可移植性并提高可伸缩性。
2.统一接口
系统中的多个组件都依赖于统一接口,包含4个子约束:
- 资源的标识
资源通过URL区分,当访问一个URL时,能够获取该资源或对它执行相应的操作。 - 通过表述操作资源
客户端请求资源时,可以指定期望的格式,服务器返回响应时,响应包含了指定格式的资源。访问同一个资源的不同格式无须修改资源的标识符,客户端也可以通过资源的表述对资源进行操作。 - 自描述消息
客户端和服务器之间传递的消息都应包含足够的信息(如资源表述的格式和内容长度,甚至相关的其他操作信息)。 - 超媒体作为应用程序状态的引擎(HATEOAS)
服务器返回的资源表述中包含与之相关的链接,这些链接能够对资源执行其他操作。
3.分层系统
服务端和客户端不知道网络中介(代理或网关等)的存在,增强安全、负载均衡和响应缓存等。
4.缓存
客户端和网络中介都可以缓存服务器返回的响应,以便于减少数据获取延迟和服务器的请求次数,提高系统性能。
5.无状态
服务器不会记录或存储客户端的状态信息。从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。
6.按需编码(可选)
允许服务器临时向客户端返回可执行的程序代码用于客户端拓展和自定义功能,简化客户端。
三、设计原则
- 使用名词的复数表示资源集合 api/users
- 使用斜线“/”表示资源间的层次关系 api/users/1/orders
- 对资源进行CRUD的操作名称不应出现在URL中,使用HTTP方法进行区分
- 查询字符串可以用来筛选、搜索和分页等操作
- URI使用小写字母,使用“-”增加可读性,避免使用下划线,结尾不应含有斜线“/”