REST 是一种应用架构风格,不是一种标准,是面向资源架构(ROA)风格,与具体技术平台无关,REST架构的应用未必创建在Web之上,与之对应的是传统的Web Service 采用的面向操做的RPC架构风格。html
1、基础概念前端
一、Web算法
为咱们提供获取和操做网络资源的方式,资源包括文字、图片、音频、视频;核心体如今三个方面,HTTP、超文本、超媒体,HTTP为网络访问的标准协议,超文本和超媒体,规范了网络信息的表现形式,利用“连接”在相关资源节点间穿针引线结成一张非线性网,即Web。数据库
二、网络协议json
(1)、IP协议跨域
处于网络层,无连接的网络协议,传输不可靠且无序,数据完整性不能保证。浏览器
- 不可靠性,即不能保证发送出去的数据报文成功到达目的地。
- 无序,即每次数据报文处理都是独立的。
- 数据不完整性,接收方没有根据报文段的校验和来检查数据在传输过程当中是否被篡改。
(2)、TCP协议缓存
位于网络层之上的传输层,基于链接的传输协议,解决了IP协议不可靠性,无序性,不完整性三个问题。数据交换双方在在数据报文传输前先创建一个双工链接,双方均可以用它来发送数据,在报文传输结束后关闭链接。安全
- 可靠性,借助“接收确认”和“超时重传” 机制来实现,发送方有个缓冲区,用来存放发送出去但还未确认的保文,超过指定时限会重发,接收到确认消息就在缓冲区删除。
- 有序性,报文编号机制,每一个数据报文都有个编号,其体现了报文的顺序,接收方接收到一个报文后,根据其编号先确认其以前编号的报文都接收了,才往应用层提交报文数据,判断标准是其记录一个上次成功递交给应用层的报文编号,若是这次接收报文的编号和上次是连续的说明是有序的,不然说明以前还有报文未接收。接收方也有个缓冲区,用来存放接收但不能向应用层提交的保文,等以前发送的全部报文都接收到以后,按序号顺序往应用层提交报文,再从缓冲区中把其删除。另外,重复的报文会被丢弃,判断重 复的标准是,报文的序号小于最后递交给应用层的报文编号或者添加到缓冲区的报文编号。
- 数据完整性,报文段有个16位的校验和(Checksum),接收方能够根据它来确认数据在传输过程当中是否被篡改。
- 报文不丢失,借助“流量控制”机制,发送和接收方缓冲区大小不一致会致使发送后的报文会丢失,若是发送方缓冲区比接收方大,其实根据缓冲区大小来发送报文的,由于缓冲区存放了发送的并且未接收的,接收方缓冲区满了后,不能处理后续接收的报文,因此接收方会及时通知发送方缓冲区剩余大小,发送方根据其来控制流量。
(3)、HTTP协议服务器
位于传输层之上的应用层,其基于传输层的TCP可靠传输协议,提供了可靠数据传输的保障。是一种无状态的网络协议,采用简单的“请求/响应”消息交换模式,不会保存屡次消息交换的会话状态,每次消息交换都是相互独立的,开始于请求发送,止于响应接
收,每次消息交换都是一次完整的事物。
IP协议根据IP地址定位数据目的地,TCP协议利用端口标识应用程序,应用程序间通信须要指定IP地址和端口。
三、资源
(1)、定义
寄宿于Web(服务器)、经过HTTP协议获取或操做的“事物“,能够是磁盘上的文件、数据库里的记录,算法计算出的结果,可使具体的事物,也能够是抽象的流程。
(2)、标识
可操做资源应该具备一个或多个惟一标识。标识的类型能够采用GUID,可是URI是达成共识的公认标准。URL和URN都是URI的一种表现形式。
(3)、URL
统一资源定位符,用来定义资源的惟一标识、位置、获取方式(协议,如HTTP)。
http://www.myhost.com/employees/001
001号员工资源的惟一标识,位置在www.myhost.com服务器上,经过HTTP协议获取
四、媒体类型
资源是一种数据,其承载了某种信息(内容含义,好比部门全部员工),相同的信息能够用不一样数据形态或数据格式来展示,这种数据格式称为媒体类型,好比相同的部门员工,能够用XML格式,也能够用JSON格式来展现。
媒体类型又称MIME类型,经常使用的媒体类型有,text/html,text/xml,text/json,image/gif,audio/mp4,video/mp4.
五、HTTP方法
资源用URI来标识,对资源的操做类型经过Http方法来指定。常见方法有如下几种:
- Get:获取资源。
- Head:获取描述资源的元数据信息。
- Option:探测请求,肯定某个目标地址的真实请求应该具备怎么样的约束,如采用怎么样的Http方法或必须携带怎么的自定义报头,而后根据其约束发送符合条件的请求。“跨域资源”的预检请求采用的就是Options方法。
- Post:添加一个新资源
- Put:添加或修改一个资源,存在就修改,不然添加,这里的修改是完整修改
- Patch:部分修改,补丁的意思
- Delete:删除资源
六、HTTP响应状态码
- 1XX:请求已被接受,并须继续处理,100-199
- 2XX:请求被成功处理, 200-299
- 3XX:重定向,须要客户端采起进一步的操做才能完成请求, 300-399
- 4XX:客户端错误,因客户端发生错误而妨碍了服务器的处理, 400-499
- 5XX:服务端错误, 500-599
七、HTTP报文
分请求报文和响应报文,内容都是包含,起始行、报头集合(空行表示结束)、主题内容,如
- 请求报文
GET http://www.myhost.com/employees/001 HTTP/1.1 起始行
Accept:text/html,application/xml... 报头集合
...
空行
空 主体内容
- 响应报文
HTTP/1.1 200 OK 起始行
Content-Type:text/html;charset=utf-8 报头集合
....
空行
<!DOCTYPE... 响应主题内容
八、超媒体/超文本
超文本是与其它数据有关联(Links)的数据。包含与其余文档连接的文档;选择连接时自动显示第二个文档。
超文本可利用引用连接其余不一样类型(内含声音、图片、动画)的文件,这些具备多媒体操做的超文本,称为超媒体(HyperMedia),意指多媒体超文本(Multimedia Hypertext),即以多媒体的方式呈现相关文件信息。
超媒体的核心是利用“连接”将相关的信息结成一个非线性的网。
九、REST(表现/应用状态转换)
REST定位为“分布式超媒体应用”的架构风格。
应用状态即WEB应用的客户端状态。
资源在浏览器中以超媒体的形式呈现,经过单击超媒体中的连接能够获取其余相关资源或对当前资源进行相应处理,获取的资源或者针对资源处理的响应一样以超媒体形式再次呈如今浏览器上。
借助于超媒体这种特殊资源呈现方式,应用状态的转换体现为浏览器中呈现资源的转换,应用状态变为了可呈现的状态,应用状态的转换变成了可呈现的状态转换,即REST。
2、RESTful Web API 特性
对于多个应用采用的架构,咱们只能说其中一个比其余的更具备REST风格。如下是ROA架构的Web API应该具有的基本特征,是指导方针。
一、URI标识资源
URI具备标志性、可读性、可寻址性。可表示单个资源,也能够表示多个资源的集合。
http://www.myhost.com/employees/001 编号为001的员工
http://www.myhost.com/sales/2017/12/03 2017年12月3号的销售额
http://www.myhost.com/orders/2017/q4 2017年第四季度的订单(资源集合)
二、使用连接关联相关资源
资源通常不是单独存在,与其余资源有某种关联,经过超文本/超媒体文档中的连接关联相关资源;咱们是用URL来标识资源的,文档中的连接采用URL地址来连接到其余资源,其可使资源地址,也能够是对资源的操做连接。好比一份XML文档中,包含一些其余资源的引用。客户端获取该文档在浏览器展示,并根据文档中引用生成一些连接,这些连接地址都是Web API 地址,供用户操做.
三、使用统一的标准资源操做接口(CRUD)
这是RESTful Web API 和RPC风格面向功能操做集合的SOAP Web Service的Web API区分的一个主要特征。URI中不包含动词,动词使用HTTP谓词(Method)。返回结果影响到接口的统一性,要求全部的返回码必须经过HTTP状态码来返回,另外,客户端从服务端取得的不是资源自己,而是资源的表现形式。
标准接口即为不一样(资源)Web API定义一致性的操做来管理各自的资源,从资源角度去组织接口,并且不一样资源操做都一致,不像RPC风格的Web API 只是从功能操做角度去考虑和组织操做。
一致的操做即CRUD,以下
public class ResourceService
{
public IEnumerable<Resource> Get();
public void Create(Resource resource);
public void Update(Resource resource);
public void Delete(string id);
}
另外,一个Web API 来管理角色的增删查,以及创建和删除角色和用户之间的映射关系。RPC、SOAP风格的Web API 定义以下:
public class RoleService
{
public IEnumerable<string> GetAllRoles();
public void CreateRole(string roleName);
public void DeleteRole(string roleName);
public void AddRolesInUser(string userName, string[] roleNames);
public void RemoveRolesFromUsers(string userName, string[] roleNames);
}
其实,其中包含两种资源,角色和角色委派,改为统一接口
public class RoleService
{
public IEnumerable<string> GetAllRoles();
public void CreateRole(string roleName);
public void DeleteRole(string roleName);
}
public class RoleAssignmentService
{
public void Create( RoleAssignment roleName);
public void Delete( RoleAssignment roleName);
}
统一接口方法名,类名隐含了资源类别,不一样资源操做,组织到不一样类中,采用统一的接口,而不是像RPC风格接口,统一放一个类里,经过不一样方法名区分。
四、使用标准的HTTP方法
经常使用就是前边列出的其中Http方法,好比新增资源
POST http://www.myhost/employees HTTP/1.1,请求主体中附上资源内容
另外,HTTP方法具备两个基本特性,安全性和幂等性。
GET、HEAD、OPTIONS是安全方法,只是获取数据,没有边界效应或反作用,另外四个方法,POST、PUT、PATCH、DELETE会致使服务器资源变化,因此是不安全的。
幂等性,即发送一次和屡次请求引发的边界效应或反作用是同样的。设计API时候,尽可能根据请求HTTP方法的幂等性来决定处理逻辑。
GET、HEAD、OPTIONS是幂等方法,DELETE和PATCH也是幂等的,都是对现有的某个资源操做,屡次操做效果都同样,POST屡次操做会增长多个资源,因此不是幂等的,PUT通常状况下也是幂等的,由于第一次不存在时候会添加,第二次操做存在了只会修改,对于PUT在特殊状况下是非幂等的,对于每次修改操做都修改一个版本号,可是有时候这种非幂等性不是很是重要。
五、多种资源表示方式(内容协商机制)
资源根据媒体类型有不一样的表现形式,每次请求能够设定须要哪一种资源的表示形式,如是须要XML仍是JSON格式的资源。
一般是利用”内容协商机制”来实现,在请求报头,Accept和Accept-language设置它所但愿的资源表示,即媒体类型和语言。
还有种方式是在URL中包含资源表示。
六、无状态性
RESTful只维护服务器上资源状态,而不维护客户端的状态;Web API 不记录客户端的之前的请求状态,其由客户端本身来维护。如分页号,Web API 不会知道上次的请求分页号,它只会根据传入的当前分页号来处理,上次分页号有客户端本身处理。是无状态的,减除了客户端亲和度,集群环境中有效实施负载均衡,每一台部署了WEB API接口的服务器对每一个客户端都是等效的。
3、如何设计友好的REST API
一、URI
URI通常由名称和id组成
(1)、单层资源:
/users 全部的用户列表
/users/1 id为1的用户
注意:名称为复数users , id最好为uuid,使用简单、无锁,分布式系统中独立处理,各自插入数据,不用担忧id冲突。
(2)、多层资源
/users/1/files 用户1的全部文件
/users/1/files/2 用户1的文件中id为2的文件
层数和参数不要太多,使用起来不方便,2层足够
(3)、查询参数不要放在URI中
/users/age/20/60 很差
/users?minAge=20&maxAge=60 写成url参数
二、资源拆分
资源与领域类具备至关高的对应关系。
三、资源命名
(1)、资源名称应该是名词或动名词形式,不要使用动词
好比建立和注销安全令牌 设计成 POST /tokens DELETE /tokens/{id}
(2)、注意名称的表意性,恰如其分的表示业务含义,不要太啰嗦
files而不要写成userFiles 太啰嗦
(3)、不要使用缩写词,避免使用有歧义或自创的所写词。
四、方法
(1)、安全性
安全性指的是一项操做不会改变资源的状态,该操做应该把资源当作只读。GET、HEAD是安全的,POST、PUT、DELETE、PATCH是不安全的。
可是,不是说不改变资源的状态,就不能改变服务器任何东西,好比GET方法中能够记录日志,不违反规范。
通常对安全的请求进行缓存,因此能够充分利用互联网的各级缓存设施。
若是你的GET方法会改变资源状态,很容易遭受到攻击,好比,GET请求进行投票,这样把GET方法的地址发到论坛或QQ群里,有人点击,就能够投票了。
(2)、幂等性
意义在于安全的自动重试刚才的操做,而不用担忧破坏业务逻辑。
例如,浏览器中普通页面能够随意刷新,表单提交的页面刷新会弹出一个警告,问你是否确实要重试,这是由于POST操做是不幂等的,自动重试会致使预期以外的结果。
GET是幂等的,不管执行多少次都没区别,
POST不是幂等的,再执行一次会建立一个新的资源
DELETE 幂等的 ,用相同的数据去更新资源,不管执行多少次,其效果都同样
五、返回值
REST风格中,成功、失败等错误码应该在响应头中做为HTTP Status code 返回,不能在响应体中返回,这是HTTP规范也是REST规范要求。
咱们能够在前端写一个过滤层,对服务端的错误信息进行统一处理,AOP拦截。