REST API
API(Application Programming Interface,应用程序编程接口)是一组用于定义应用程序或设备相互连接和通信的规则,它是一种机制,使一个应用程序或服务能够访问另一个应用程序或服务中的资源。
REST(Representational State Transfer,表现层状态转换)架构样式是Roy Thomas Fielding在2000年在他的博士学位论文《Architectural Styles and the Design of Network-based Software Architectures》(《架构风格与基于网络的软件架构设计》)中提出的 —— Roy Thomas Fielding博士是美国计算机科学家, HTTP、URI等 Web 架构标准和Apache HTTP服务器的主要设计者,定义了REST架构样式。
REST API就是符合 REST架构样式设计原则的API,有时也被称为 RESTful API。它几乎可以使用任何编程语言进行开发,并支持多种数据格式,并且必须符合以下六个设计原则(称为架构约束):
- 统一接口
- 客户端/服务器解耦
- 无状态
- 可缓存性
- 分层系统架构
- 按需编码(可选)
特性
- 资源(Resources):网络上的一个实体,可以是一段文本、一张图片、一首歌曲、一种服务,可以用一个唯一的URI(统一资源定位符)指向它,每种资源对应一个特性的URI。
- 表现层(Representation):把资源具体呈现出来的形式。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式。
- 状态转换(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转换”,这种转换是建立在表现层之上的,所以就是“表现层状态转换”。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE:
- GET:获取资源
- POST:新建资源
- PUT:更新资源
- DELETE:删除资源。
HTTP 请求方法在RESTful Web 服务中的典型应用
优点
- 可以利用缓存Cache来提高响应速度
- 通讯本身的无状态性可以让不同的服务器处理一系列请求中的不同请求,提高服务器的扩展性
- 浏览器即可做客户端,简化软件开发的需求
- 相对于其他叠加的HTTP协议之上的机制,REST的软件依赖性更小
- 不需要额外的资源发现机制
- 在软件技术演进中的长期的兼容性更好
重点说一下什么是“无状态”和“扩展性”。
- 在京东上选择了一款华为荣耀6手机,并添加到购物车,然后又选择了一款荣耀手环,也添加到购物车中,最后点击结算按钮,如果是京东网站采用了“无状态”,那么,页面不会呈现出您之前选择的两款产品信息及其价格。很简单,这里的“购物车”实现了“有状态”。
- 但REST API也可以实现有状态,只需在URL里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/1234”。
- REST API可以不需要与客户端进行会话,通过这些操作(指在URL里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/1234”)后,客户端向服务器发出请求后,哪怕你在服务器上执行卸载平台和操作系统、拆除服务器硬件、重新组装服务器、重新安装操作系统、平台、应用程序备份恢复操作,也不会影响客户端。
- REST之所以可以提高系统的可扩展性,就是因为它要求所有的操作都是无状态的。由于没有了上下文(Context)的约束,做分布式和集群的时候就更为简单,也可以让系统更为有效的利用缓冲池(Pool)。并且由于服务器端不需要记录客户端的一系列访问,也减少了服务器端的负载。