理解Restful 架构

理解Restful 架构
 
新型的软件 —— 网站即软件
 
互联网软件 采用客户端/ 服务器模式   , 建立在分布式体系上,通过互联网通信,有高延时,高并发特点。
 
软件开发主要针对单机环境,网路则主要是研究系统之间的通信。现在我们必须考虑,如何开发在互联网环境中使用的软件。
 
Restful 架构,是目前最流行的一种互联网软件架构。结构清晰,符合表中,易于理解,扩展方便。
 
一 、起源:
 
REST  被谁提出的,Roy Thomas Fielding 写的一篇论文提到这种概念。
 
下面是Fielding 论文的大致目的:
 
软件 和 网路     计算机领域两大前沿
 
软件 更多人关注软件的设计。 很少有人评估 设计选择对系统行为的影响
 
网络 关注系统之间通信行为的细节、改进特定通信机制的表现,———— 忽略一个事实: 改变应用程序的互动风格 比 改变互动协议,对整体表现有更大的影响。
 
Fielding 写这篇论文的目的就是: 在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。
二 、 名称
 
Fielding 将他对互联网软件的架构原则 ,定义为 REST , 即 Repressentational State Transfer 的缩写。翻译成中文是 “表现层状态转化”。
 
如果一个架构符合REST 原则,就称它为RESTFUL 架构。
 
三、资源
 
REST 的名称“表现层状态转化”中,省略了主语。“表现层”指的是“资源 ”的表现层。
”资源“是网络上的一个实体,或者说是网络上的一个具体信息。每种资源对应一个特定的URI(统一资源定位符),要获取这个资源,访问它的URI 就可以。
 
所谓“上网”,就是与互联网上一些列的“资源”互动,调用它的URI。
 
四、表现层(representation)
 
“资源”是一种信息实体,它可以有多种外在表现形式。我们把“资源”具体呈现出来的形式,叫做它的“表现层”。
    URI 只代表资源的实体,不代表它的形式。
    资源的具体表现形式,在 HTTP 请求头信息中,用Accept 和 Content-type 字段指定。
 
五、状态转化(State Transfer)
 
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
 
互联网通信协议 HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,客户端想要操控服务器,必须通过某种手段,让服务端发生“状态转化”,而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。
 
客户端能用的手段就是HTTP协议,请求头里四个表示操作方式的动词:
GET 、POST 、 PUT、DELETE。代表四种操作:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源。
 
六、综述
 
总结一下什么是 RESTFUL 架构:
    (1)每一个URI 代表一种资源;
    (2)客户端和服务器之间,传递这种资源的某种表现层。
    (3)客户端通过四个HTTP 动词,对服务端资源进行操作,实现“表现层状态转化”;
 
七、误区
 
   最常见的一种设计错误,就是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:返回一个空文档

相关推荐