接口测试学习笔记之02 REST & RESTfull API
REST, REpresentational State Transfer,直译为表现层状态转化,又称具象状态传输
REST 是Roy Thomas Fielding博士于2000年在他的博士论文中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。表现层状态转换是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为
REST
或RESTful
)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。因此表现层状态转换提供了在互联网络的计算系统之间,彼此资源可交互使用的协作性质(interoperability)。相对于其它种类的网络服务,例如 SOAP服务则是以本身所定义的操作集,来访问网络上的资源。
要理解什么是REST
,我们需要理解下面几个概念:
REST – REpresentational State Transfer,之所以晦涩难懂,是因为前面的主语被省掉了,全称应是 Resource Representational State Transfer,即:资源在网络中以某种表现形式进行状态转移。
- Resources, 资源
什么是资源呢?资源,即数据,就是我们平常上网访问的一张图片、一个文档、一个视频等。这些资源我们通过URI来定位,也就是一个URI(Uniform Resource Identifier,统一资源标志符)表示一个资源。 - Representation, 表现层
资源是一个具体的实体信息,可以有多种的展现方式。而把实体展现出来就是表现层,例如一个txt文本信息,他可以输出成html、json、xml等格式,一个图片也可以jpg、png等方式展现,这个就是表现层的意思。URI确定一个资源,但是如何确定它的具体表现形式呢?应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对”表现层”的描述。 - State Transfer, 状态转化
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,肯定涉及到数据和状态的变化。
而HTTP协议是无状态的,那么这些状态肯定保存在服务器端,所以如果客户端想要通知服务器端改变数据和状态的变化,肯定要通过某种方式来通知它。客户端能通知服务器端的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET
、POST
、PUT
、DELETE
。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,如下图所示。
综合上述概念,我们可以得出:
- 需要注意的是,
REST
是设计风格而不是标准。REST
通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。 REST
描述的是在网络中client和server的一种交互形式;- 一句话来说,
REST
是URL定位资源,用HTTP动词(GET, POST, DELETE, PUT)描述操作 REST
本身不实用,实用的是如何设计RESTful API
(符合REST
设计风格的网络接口);- 在由Server提供的
RESTful API
中,URL中资源的指定通常只使用名词,原则上不使用动词。
在了解了REST
相关概念之后,考虑一下为什么要用RESTful
结构呢?
大家都知道”古代”网页是前端后端融在一起的,比如之前的PHP,JSP等。在之前的桌面时代问题不大,但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful更是它们最好的选择。在RESTful架构下:
此外需要注意的是,REST
架构风格有六条重要的约束:
- 客户端-服务器(Client-Server)
通信只能由客户端单方面发起,表现为请求-响应的形式。 - 无状态(Stateless)
通信的会话状态(Session State)应该全部由客户端负责维护。 - 缓存(Cache)
响应内容可以在通信链的某处被缓存,以改善网络效率。 - 统一接口(Uniform Interface)
通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。 - 分层系统(Layered System)
通过限制组件的行为(即每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。 - 按需代码(Code-On-Demand,可选)
支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。
相关参考链接:
https://en.wikipedia.org/wiki/Representational_state_transfer