Restful是一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。如果一个架构符合REST原则,就称它为RESTful架构,可以理解为:
每一个URI代表一种资源;
客户端和服务器之间,传递这种资源的某种表现层;
客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
REST(Representational State Transfer),表现层状态转化,指一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
表现层(Representation): "资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。
比如,文本可以用txt格式表现,也可以用HTML格式等表现。URI只代表资源的实体,不代表它的形式。它代表"资源"的位置,它的具体表现形式,是在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
状态转化(StateTransfer):访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。
因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(StateTransfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词,它们分别对应四种基本操作:
GET: GET用来获取资源
POST: POST用来新建资源(也可以用于更新资源)
PUT: PUT用来更新资源
DELETE: DELETE用来删除资源。
URI(Uniform Resource Identifier):是指一个用于标识某一互联网资源名称的字符串。该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源:HTML文档、图像、视频片段、程序等由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。
统一接口:REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括7个HTTP方法: GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS。
GET(select):从服务器取出资源(一项或多项)。
POST(create):在服务器新建一个资源。
PUT(update):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(update):在服务器更新资源(客户端提供改变的属性)。
DELETE(delete):从服务器删除资源。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。
按照HTTP规范定义,使用标准方法进行资源的操作,比如GET、PUT、POST和DELETE。在服务器端,应用程序状态和功能可以分为各种资源。资源是一种概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。
另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。
当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现。
1、RESTful的实现:RESTful Web 服务与 RPC 样式的 Web 服务
RPC样式的 Web 服务客户端将一个装满数据的信封(包括方法和参数信息)通过 HTTP 发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。
每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端点。它忽略 HTTP 的大部分特性且仅支持POST方法。
RPC风格开发关注于服务器-客户端之间的方法调用,不关注基于哪个网络层的那种协议,即RPC是面向方法的调用过程的。而REST是面向资源状态的。
RESTful Web 服务是一种遵守REST式风格的Web服务,主要特点是方法信息存在于HTTP方法中,作用域存在于URI中,例如,在一个获取设备资源列表的GET请求中,方法信息是GET,作用域信息是URI中的包含的对设备资源的过滤、分页、排序等条件。
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTP GET、POST、PUT、DELETE,还可能包括HEADER和OPTIONS方法。
2、RESTful的实现:RESTful Web服务的Java框架
有两个Java 框架可以帮助构建 RESTful Web 服务。erome Louvel和Dave Pawson开发的Restlet。
它实现针对各种 RESTful 系统的资源、表示、连接器和媒体类型之类的概念,包括 Web 服务。
在 Restlet 框架中,客户端和服务器都是组件。组件通过连接器互相通信。该框架最重要的类是抽象类Uniform及其具体的子类 Restlet,该类的子类是专用类,比如 Application、Filter、Finder Router和Route。
这些子类能够一起处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操作。Resource 类生成客户端的表示形式。
3、RESTful的实现:构建RESTful Web服务的多层架构
RESTful Web服务和动态Web应用程序在许多方面都是类似的。有时它们提供相同或非常类似的数据和函数,尽管客户端的种类不同。与大部分动态 Web 应用程序一样,RESTful Web 服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和 GUI 客户端共享。
惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力。
在浏浏览器中运行且作为 RESTful Web服务消费者运行的Ajax、Flash、JavaFX、GWT、博客和wiki 等,因为它们都代表用户以自动化样式运行。
自动化Web服务客户端在Web层向Resource Request Handler发送 HTTP响应。客户端的无状态请求在头部包含方法信息,每个请求都包含所有必需的信息,包括 Resource Request Handler 用来处理请求的凭据。
从Web服务客户端收到请求之后,Resource Request Handler 从业务逻辑层请求服务。
Resource Request Handler确定所有概念性的实体,系统将这些实体作为资源公开,并为每个资源分配一个惟一的URI。但是,概念性的实体在该层是不存在的。
它们存在于业务逻辑层。可以使用 Jersey 或其他框架(比如 Restlet)实现ResourceRequest Handler。
上图中的 Web 浏览器客户端作为 GUI 的前端,使用表示层中的Browser Request Handler生成的 HTML 提供显示功能。
Browser Requester Handler可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器做出响应,表示供用户在浏览器中显示使用。
业务规则可以集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。
数据访问层提供与数据存储层的交互,可以使用 DAO 设计模式或者对象-关系映射解决方案(如Hibernate、OJB或iBATIS)实现。作为替代方案,业务层和数据访问层中的组件可以实现为 EJB 组件,并取得 EJB 容器的支持,该容器可以为组件生命周期提供便利,管理持久性、事务和资源配置。
数据存储层包括数据库系统、LDAP 服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。
使用该架构,您可以开始看到 RESTful Web 服务的力量,它可以灵活地成为任何企业数据存储的统一 API,从而向以用户为中心的 Web 应用程序公开垂直数据,并自动化批量报告脚本。
领取专属 10元无门槛券
私享最新 技术干货