理解Restful 架构

理解Restful 架构
 
新型的软件 —— 网站即软件
 
互联网软件 采用客户端/ 服务器模式   , 创建在分布式体系上,经过互联网通讯,有高延时,高并发特色。
 
软件开发主要针对单机环境,网路则主要是研究系统之间的通讯。如今咱们必须考虑,如何开发在互联网环境中使用的软件。
 
Restful 架构,是目前最流行的一种互联网软件架构。结构清晰,符合表中,易于理解,扩展方便。
 
一 、起源:
 
REST  被谁提出的,Roy Thomas Fielding 写的一篇论文提到这种概念。
 
下面是Fielding 论文的大体目的:
 
软件 和 网路     计算机领域两大前沿
 
软件 更多人关注软件的设计。 不多有人评估 设计选择对系统行为的影响
 
网络 关注系统之间通讯行为的细节、改进特定通讯机制的表现,———— 忽略一个事实: 改变应用程序的互动风格 比 改变互动协议,对总体表现有更大的影响。
 
Fielding 写这篇论文的目的就是: 在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,获得一个功能强、性能好、适宜通讯的架构。

 

二 、 名称
 
Fielding 将他对互联网软件的架构原则 ,定义为 REST , 即 Repressentational State Transfer 的缩写。翻译成中文是 “表现层状态转化”。
 
若是一个架构符合REST 原则,就称它为RESTFUL 架构。
 
3、资源
 
REST 的名称“表现层状态转化”中,省略了主语。“表现层”指的是“资源 ”的表现层。
”资源“是网络上的一个实体,或者说是网络上的一个具体信息。每种资源对应一个特定的URI(统一资源定位符),要获取这个资源,访问它的URI 就能够。
 
所谓“上网”,就是与互联网上一些列的“资源”互动,调用它的URI。
 
4、表现层(representation)
 
“资源”是一种信息实体,它能够有多种外在表现形式。咱们把“资源”具体呈现出来的形式,叫作它的“表现层”。
    URI 只表明资源的实体,不表明它的形式。
    资源的具体表现形式,在 HTTP 请求头信息中,用Accept 和 Content-type 字段指定。
 
5、状态转化(State Transfer)
 
访问一个网站,就表明了客户端和服务器的一个互动过程。在这个过程当中,势必涉及到数据和状态的变化。
 
互联网通讯协议 HTTP协议,是一个无状态协议。这意味着,全部的状态都保存在服务器端。所以,客户端想要操控服务器,必须经过某种手段,让服务端发生“状态转化”,而这种转化是创建在表现层之上的,因此就是“表现层状态转化”。
 
客户端能用的手段就是HTTP协议,请求头里四个表示操做方式的动词:
GET 、POST 、 PUT、DELETE。表明四种操做:GET 用来获取资源,POST 用来新建资源(也能够用于更新资源),PUT 用来更新资源,DELETE 用来删除资源。
 
6、综述
 
总结一下什么是 RESTFUL 架构:
    (1)每个URI 表明一种资源;
    (2)客户端和服务器之间,传递这种资源的某种表现层。
    (3)客户端经过四个HTTP 动词,对服务端资源进行操做,实现“表现层状态转化”;
 
7、误区
 
   最多见的一种设计错误,就是URI 包含动词。 
     由于"资源"表示一种实体,因此应该是名词,URI不该该有动词,动词应该放在HTTP协议中。
 
  另外一个设计误区,就是在URI中加入版本号:    
    由于不一样的版本,能够理解成同一种资源的不一样表现形式,因此应该采用同一个URI。
 
 
 
过滤信息
若是记录数量不少,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。
* limit=10:指定返回记录的数量
* offset=10:指定返回记录的开始位置。
* page=2&per_page=100:指定第几页,以及每页的记录数。
* sortby=name&order=asc:指定返回结果按照哪一个属性排序,以及排序顺序。
* animal_type_id=1:指定筛选条件

 

 
 
状态码
 
服务器向用户返回的状态码和提示信息,常见的有如下一些(方括号中是该状态码对应的HTTP动词)。
 
* 200 OK - [GET]:服务器成功返回用户请求的数据,该操做是幂等的(Idempotent)。
* 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
* 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
* 204 NO CONTENT - [DELETE]:用户删除数据成功。
* 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操做,该操做是幂等的。
* 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
* 403 Forbidden - [*] 表示用户获得受权(与401错误相对),可是访问是被禁止的。
* 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操做,该操做是幂等的。
* 406 Not Acceptable - [GET]:用户请求的格式不可得(好比用户请求JSON格式,可是只有XML格式)。
* 410 Gone -[GET]:用户请求的资源被永久删除,且不会再获得的。
* 422 Unprocesable entity - [POST/PUT/PATCH] 当建立一个对象时,发生一个验证错误。
* 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将没法判断发出的请求是否成功。
 
 
错误处理(Error handing)
 
若是状态码是4xx,就应该向用户返回出错信息。通常来讲,返回的信息中将error做为键名,出错信息做为键值便可。
{
    error: "Invalid API key"
}
 
 
返回结果
 
针对不一样操做,服务器向用户返回的结果应该符合如下规范。
* GET /collection:返回资源对象的列表(数组)
* GET /collection/resource:返回单个资源对象
* POST /collection:返回新生成的资源对象
* PUT /collection/resource:返回完整的资源对象
* PATCH /collection/resource:返回完整的资源对象
* DELETE /collection/resource:返回一个空文档
相关文章
相关标签/搜索