RESTful 架构基础( 二 )

 

译注:杜威十进制图书分类法由美国图书馆专家麦尔威·杜威发明,于1876年首次发表,历经22次的大改版 。该分类法以三位数字代表分类码,共可分为10个大分类、100个中分类及1000个小分类 。
 
就图书馆用户而言,上面提到的这些 URL 可能就是只读的,但是图书馆员使用应用程序时实际上可以操作这些资源 。
例如添加一本新书,可以向 main/book 地址 POST 一个 XML 。使用 curl 提交,看起来可能像这样:
$ curl –u username:password -d @book.xml -H "Content-type: text/xml" http://fakelibrary.org/book 
此时,服务器可能会对提交的内容进行校验,创建与图书相关的记录,并返回响应代码201——表示已创建新资源 。新资源的 URL 可以在响应的 Location 头中找到 。
RESTful 请求一个重要特性:每次请求都包含了充足的状态信息来响应请求 。这为服务器的可见性和无状态创造了条件,并为扩展系统和识别发送的请求内容提供了理想特性 。对于缓存结果也非常有帮助 。服务器地址和请求状态组合成可计算的 hash 键值,并形成一个结果集:
http://fakelibrary.org + /book/isbn/978-0596801687 
接下来我们会先介绍 GET 请求 。客户端在需要时发出 GET 请求获取指定资源 。客户端可以在本地缓存请求结果,服务器可以在远程缓存结果,系统的中间层可以在请求链路中间缓存结果 。这是一个与具体应用程序无关的特性,可以加入系统设计中 。
正因为可以操作资源,也就意味着并不是每个人都可以这样做 。我们完全可以建立一个防护模型,要求用户在操作前验证身份,证明他们具有该操作的授权 。在本文的最后,将提供一些提升 RESTful 服务安全性的内容 。
2. REST 和 SOAP 比怎么样?
SOAP:简单对象访问协议(Simple Object Access Protocol) 。是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议 。一条 SOAP 消息就是一个普通的 XML 文档,包含必需的 Envelope 元素、可选的 Header 元素、必需的 Body 元素和可选的 Fault 元素 。
 
把 REST 与 SOAP 划等号是错误的 。在这两者之间进行比较,带来的困扰远多于好处 。简单来说,它们不是一回事 。尽管可以用这两种方法解决许多架构问题,但是它们不能相互替换 。
这种混淆很大程度上源于对 “REST 是通过 URL 调用 Web 服务”这句话的误解 。这种观点与 RESTful 架构的功能相距甚远 。如果不全面深入理解 RESTful 的架构实现,就很容易误解 REST 实践的本意 。
利用 REST 的最佳方式,是将生产和消费过程中的信息与技术分离实现解耦,进而更好地管理系统,让架构具备以下特性:
  • 高性能
  • 可扩展
  • 通用
  • 简洁
  • 可修改
  • 可扩展
 
这并不是说,基于 SOAP 构建的系统不能具备上述特性 。而是当技术、组织或过程的复杂性造成不能在单个事务中完成请求的生命周期时,这种情况 SOAP 能够发挥最佳效果 。
3. Richardson 成熟度模型
Leonard Richardson 引入了一种成熟度模型,部分阐述了 SOAP 与 REST 之间的区别,并提供一种对不同类型的系统进行分类的框架 。许多人不恰当地称之为 “REST” 。可以将这种分类看作系统中不同 Web 技术组件紧密程度的度量标准:包括信息资源、HTTP 作为应用层协议和作超媒体作为控制媒介 。
 
RESTful 架构基础

文章插图
 
 
 
称其为“成熟度模型”似乎意味着应该只构建“成熟度”最高的系统 。这种看法是不合适的 。第2级是有价值的,从2级向3级转变通常只是采用了一种新的 MIME 类型 。然而,从0级到3级的转变要困难得多,因此增量式升级转变通常也会增值 。
首先,确定希望公开哪些信息资源 。采用 HTTP 作为处理这些信息资源的应用协议,包括内容协商 。接下来,当一切就绪时,使用基于超媒体的 MIME 类型,这样就可以充分享受 REST 的好处了 。
4. 动词
动词是用来与服务器资源交互的方法或操作 。RESTful 系统中有限的动词让刚接触该的使用者感到困惑和沮丧 。看似武断和不必要的约束,目的是鼓励以应用程序无关的形式提供可预测的行为 。通过明确、清晰地定义这些动词的行为,客户端可以在网络中断或故障时自主处理 。
精心设计的 RESTful 系统主要使用4个 HTTP 动词 。


推荐阅读