您的位置 首页 java

解读REST 服务

英文 RESTful 对应的中文是REST 式的。RESTful 的应用或者Web 服务是常见的两种

REST 式的项目部署、存在的方式。本节将介绍RESTful Web Services 并对比和传统Web

Services 的不同。

1. REST 式的Web 服务

RESTful Web Services(REST 式的Web 服务)是一种遵守REST 式风格的Web 服务。

REST 式的Web 服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)的应用。

其主要特点是方法信息存在于HTTP 的方法中(比如GET、PUT),作用域存在于URI 中。

例如,在一个获取设备资源列表的GET 请求中,方法信息是GET,作用域信息是URI 中包

含的对设备资源的过滤、分页和排序等条件。

2. 对比 RPC 风格

相比Web 服务领域广为流行的RPC(Remote Procedure Call ,远程过程调用)风格,

REST 风格更轻量和快速。从方法信息角度看,REST 采用标准的HTTP 方法,而RPC 请求

都是HTTP 协议的POST 方法,其方法信息包含在SOAP 协议包或HTTP 协议包中,方法名

称不具有通用性。从作用域角度看,REST 采用URI 显式定义作用域,而RPC 的这一信息同

样包含于协议包中,不能直观呈现。

RPC 风格的开发关注于服务器-客户端之间的方法调用,而不关注基于哪个网络层的

哪种协议。也就是说,RPC 是面向方法调用过程的,相比而言,REST 是面向资源状态的。

RPC 风格的两个代表是XML-RPC 和大Web 服务。

(1)XML-RPC

XML-RPC 是一种使用XML 格式封装方法调用,并使用HTTP 协议作为传送机制的

RPC 风格的实现。XML-RPC 的请求方法都是HTTP 协议的POST 方法,请求和响应的数据

格式均为XML。

XML-RPC 的数据格式和使用XML 作为资源的表述的REST 外观上很相似,但数据的内容则大相径庭。REST 式的XML 信息的主体是对一个资源状态的表述,无须包含方法信息,因为其请求的HTTP 方法就已经决定了这一点。XML-RPC 的请求数据结构额外包含方法调用信息和参数信息。

对于响应信息的内容,两者也截然不同,REST 式的通常会包含响应实体信息以及HTTP 状态码和可选的异常信息,而XML-RPC 的返回信息仅仅是对方法调用的响应信息。

XML-RPC 是一种遗留技术,已经被SOAP 取代。在 Java 领域,JAX-RPC 标准已经被

JAX-WS 取代。XML-RPC 的应用依然存在,著名的测试用例管理系统TestLink 的对外接口

就是使用PHP 开发的XML-RPC。

(2)大Web 服务

大Web 服务(Big Web Services )是Leonard Richardson 和Sam Ruby 在其所著的《RESTful Web Services 》一书中,对基于SOAP+ WSDL+UDDI+WS-标准栈等技术实现RPC 风格的大型Web 服务的统称。事实上,“大Web 服务”这一说法也被Java EE 7 的布道者在多次演讲中使用。在Java 领域,对应的标准主要是JAX-WS 2.0/2.1/2.2(JSR 224)。

相较REST 式的Web 服务,大Web 服务功能更强大、设计更复杂。大Web 服务同样是跨平台、跨语言的,对复杂的数据类型的支持也非常好。大Web 服务是基于RPC 风格的重量级的设计,因此方法和作用域无法通过直观断定,需要定义在消息中,而且方法名不是统一和通用的。同时,大Web 服务走HTTP 协议时,请求都是基于POST 方法的。

对比RPC 风格的Web 服务,REST 式的Web 服务形式更简单、设计更轻量、实现更快捷。

REST 无须引入SOAP 消息传输层,无须注册服务,也没有客户端stub 的概念等。但是,REST 风格的Web 服务并没有像大Web 服务那样提供诸如安全策略等全面的标准规范。

大Web 服务和REST 式的Web 服务各有其优势,并不是一种代换关系。在实际开发中,两者共存于一个项目中也是一种解决方案。

3. 对比 MVC 风格

MVC 风格的出现将模型、视图、控制解耦,其亮点是从前到后的一致性,其结构简洁、逻辑清晰,易于扩展和增强。MVC 在Java 领域的普遍实现方式是在Web 前端使用标签库来对应服务端的模型类实例和控制类实例,标签库和服务端依赖库可以是松散的耦合——比如Spring 生态系统,也可以是全栈式的统一体系,比如JSF 体系。但无论如何实现,在Web 前端的开发过程中,必须时刻考虑页面标签和服务端的映射关系,包括模型类的匹配和转换,数据结构,控制类输入和输出的参数类型和数量等。

因此,MVC 风格偏重于解决服务器端的逻辑分层,客户端是逻辑分层的延伸。MVC 的标签库,虽然其形态已经和HTML 页面融合,但本质上还是Java 编写的装饰模式的类实例,对应的是服务器端使用Java 编写的模型类或者控制器类,因此MVC 很难实现跨语言解耦。而REST 风格偏重于统一接口,因此具体实现就可以跨平台和跨语言。正如附录中Web 简史中所述,REST 推动了Web 开发的新时代,使用纯HTML 作为客户端,没有服务器端和客户端的耦合。显而易见,使用纯HTML 开发的REST 客户端和使用Java 开发的REST 服务器端并不存在语言上的耦合。

MVC 和REST 式并不是互斥的,像Spring 的MVC 模块已经支持REST 式的开发。Jersey 作为JAX-RS 标准的实现,也实现了MVC 的功能,可参考相关模块:jersey-mvc、jersey-mvc-freemarker 和jersey-mvc-jsp。需要说明的是,本书致力于讲述JAX-RS,对Jersey 实现中的JAX-RS 之外的功能只做必要的讲述。由于MVC 和REST 之间有更多的并行存在性,因此本书余文没有将MVC 放入讲述之列。

文章来源:智云一二三科技

文章标题:解读REST 服务

文章地址:https://www.zhihuclub.com/194552.shtml

关于作者: 智云科技

热门文章

网站地图