zoukankan      html  css  js  c++  java
  • 理解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:返回一个空文档
  • 相关阅读:
    hibernate
    杨辉三角
    查看端口号
    一个线程同步问题的例子
    SQL关系数据库设计三大范式
    C#OpenFileDialog的使用
    莫队算法
    蒟蒻已知的高能数学公式
    C++ 产生随机数
    C++ 输出小数点后 n 位
  • 原文地址:https://www.cnblogs.com/mingjie-c/p/11754329.html
Copyright © 2011-2022 走看看