API Testing 入门基础系列 之 API Testing 8 - 介绍REST & REST API
什么是REST?
REST(Representational State Transfer)表述性状态传递. 它是一种架构风格,定义一系列约束条件来创建web服务或则API。Web服务采用REST的风格设计和实现被称为REST API或RESTFul API或则Web services。这些web services提供互联网计算机系统之间的互通性。符合REST风格的Web services允许请求系统通过一系列统一的,预先定义的无状态操作来访问和操作Web 资源表述。
它是Roy Fielding博士在2000年他的博士论文中提出来的,它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
Wikipedia 中定义REST如下:
设计良好的网络应用表现为一系列的网页,这些网页可以看作的虚拟的状态机,用户选择这些链接导致下一网页传输到用户端展现给使用的人,而这正代表了状态的转变。通过使用无状态协议HTTP和标准操作,REST系统目的就是为了更快的性能,可靠性和扩展性。即使系统正在运行,通过重用组件可达到管理和更新系统,不会影响整个系统。
REST 6个准则:
REST提供6个指导原则或则是约束,如果一个API被称为RESTFull API,那它必须满足这些约束。
客户端-服务器结构(Client–server architecture)
连接协议具有无状态性(Statelessness)
能够利用Cache机制增进性能(Cacheability)
统一接口(Uniform interface)
层次化的系统(Layered system)
随需代码 - Javascript (可选)(Code on demand)
客户端-服务器架构(Client–server architecture):
将客户端与服务器分开, 这种关注点分离意味着,例如,客户端不关心数据存储,数据存储仍然是每个服务器的内部,从而提高了客户端代码的可移植性。 服务器不关心用户界面或用户状态,因此服务器可以更简单,更具可伸缩性。 只要不改变接口,服务器和客户端也可以独立替换和开发。
无状态(Statelessness):
在客户-服务器架构中,服务端不会保存客户端请求之间的任何信息。每个从客户端发给服务端的请求必须包含所有必要的信息,以此服务端才能理解并做出正确的响应。不管是同一个客户端对同一个资源发出多次请求,每一次请求都是独立的,必须包含所有必要的信息。
可缓存(Cacheable):
我们知道服务端基于客户端的请求会返回响应。这个响应可以被缓存以帮助后续相关请求重复使用数据。适当的利用部分或则全部的缓存可以减少客户端与服务器端的交互。更进一步提高性能和可扩展性。一个REST API应该鼓励设计成存储缓存数据。
统一接口:
统一接口约束 定义了客户端和服务端之间的接口,它简化和结构了架构,使每个部件都能独立发展。对某一部件进行改变,不会影响其它部件。4个接口约束:
1.资源标识(identification of resources):
使用uri作为资源标识符,在请求中标识各个资源。
资源本身在概念上 与返回给客户端的表示分开,
举例: 服务器不发送其数据库,而是发送一些表示某些数据库记录的 HTML, XML或 JSON
2.通过表述操控资源(manipulation of resources through representations)
在客户端具有足够的权限,并且当客户端持有资源的 表示时, 它有足够的信息来修改和删除服务器上的资源。
资源的定义: 比如服务器上的数据库资源
表示的定义: 返回给客户端的数据库几行记录
简单来说:客户端可以操控服务器上的资源。
3. 自我描述信息(self-descriptive messages)
每条消息都有足够的信息来描述如何处理消息,说的就是:
http request:
start line
headers
body
http response:
status line
headers
body
总结起来就是: headers 包含足够信息: 包括 cacheability, media type 等
4. hypermedia 作为应用状态引擎(hypermedia as the engine of application state)
什么是 hypermedia: 也被成为 hyperlinks (hyperlinks存在于 hypertext中)
具体就是:
客户端通过请求body内容,query-string参数,请求Headers和请求的URI(资源标识符)传递状态。服务器端通过响应body内容,响应码及响应Headers传递状态给客户端。
层次化系统:
在客户-服务器架构中,我们通常认为是2层,但实际上在请求和响应之间,有多层职责。客户端通常无法判断它是直接连接到终端服务器,还是沿途的中介。 中间服务器可以通过启用负载平衡和提供共享缓存来提高系统可伸缩性。 layers也可以实施安全策略。
随需代码:
这个是可选约束,服务器能够通过向客户端传输可以执行的逻辑来临时扩展或自定义客户端的功能。 这样的示例可以包括编译的组件,例如Java applet和客户端脚本,例如JavaScript。