由于它简便、轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web务成为基于SOAP服务的一个最有前途的替代方案。在本文中,我们将概述REST和RESTful Web服务的概念,并将它们与基于 RPC-style/SOAP的Web服务相比较。您还将学习有关使用Java™ 框架构建RESTful Web服务的内容,以及使用共享多层架构构建RESTful Web服务和动态Web应用程序的内容。
简介
现代Web应用程序必须提供桌面风格(desktop-like)的富浏览器界面,对外部客户端应用程序使用Asynchronous JavaScript和XML(Ajax),或者 Google Web Toolkit(GWT)以及RESTful Web服务。本文建议对Ajax/GWT使用Resource Request Handler(RRH)并从外部客户端应用程序中调用,以及使用一个Browser Request Handler(BRH)处理浏览器的请求,生成可在浏览器中显示的输出。两个处理程序共享一个通用Business Logic Layer,并与Data Access Layer交互。RRH和BRH的抽象简化了设计并帮助简化代码重用,产生更加灵活和可扩展的架构。
什么是REST?
REST(REpresentation State Transfer)描述了一个架构样式的网络系统,比如web应用程序。它首次出现在2000年Roy Fielding的博士论文中,他是HTTP规范的主要编写者之一。REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI(Universal Resource Identifier)得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的TTP方法,比如GET、PUT、POST和DELETE。Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。
另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。
当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现。
RESTful Web服务RPC样式的Web服务
最近,使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI 表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。
由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。RESTful Web服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的Web浏览器构建一个GET URL并读取返回的内容。
在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTP GET、POST、PUT、DELETE,还可能包括HEADER和OPTIONS。
在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源 —— 将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。
Leonard Richardson和Sam Ruby在他们的著作RESTful Web Services中引入了术语REST-RPC混合架构。REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。好几个知名的Web服务,比如Yahoo的Flickr API和del.icio.us API都使用这种混合架构。
RESTful Web服务的Java框架
有两个Java框架可以帮助构建 RESTful Web服务。erome Louvel和Dave Pawson开发的Restlet(见参考资料)是轻量级的。它实现针对各种RESTful系统的资源、表示、连接器和媒体类型之类的概念,包括Web服务。在Restlet框架中,客户端和服务器都是组件。组件通过连接器互相通信。该框架最重要的类是抽象类Uniform及其具体的子类Restlet,该类的子类是专用类,比如Application、Filter、Finder、Router和Route。这些子类能够一起处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操作。Resource类生成客户端的表示形式。
JSR-311(见参考资料)是Sun Microsystems的规范,可以为开发RESTful Web服务定义一组Java API。Jersey(见参考资料)是对JSR-311的参考实现。
JSR-311 提供一组注释,相关类和接口都可以用来将Java对象作为Web资源展示。该规范假定HTTP是底层网络协议。它使用注释提供URI和相应资源类之间的清晰映射,以及HTTP方法与Java对象方法之间的映射。API支持广泛的HTTP实体内容类型,包括HTML、XML、JSON、GIF、JPG等。它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。
构建RESTful Web服务的多层架构
RESTful Web服务和动态Web应用程序在许多方面都是类似的。有时它们提供相同或非常类似的数据和函数,尽管客户端的种类不同。例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。如果还提供Web服务供公司、零售商甚至个人能够自动订购产品,它将非常有用。与大部分动态Web应用程序一样,Web服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和GUI客户端共享。惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力。
图 1 展示了自动化客户端,包括Java和各种语言编写的脚本,这些语言包括Python、Perl、Ruby、PHP或命令行工具,比如 curl。在浏览器中运行且作为RESTful Web服务消费者运行的Ajax、Flash、JavaFX、GWT、博客和wiki都属于此列,因为它们都代表用户以自动化样式运行。自动化Web服务客户端在Web层向Resource Request Handler发送HTTP响应。客户端的无状态请求在头部包含方法信息,即POST、GET、PUT 和 DELETE,这又将映射到Resource Request Handler中资源的相应操作。每个请求都包含所有必需的信息,包括Resource Request Handler用来处理请求的凭据。
图 1. 多层Web应用程序环境图
从Web服务客户端收到请求之后,Resource Request Handler从业务逻辑层请求服务。Resource Request Handler确定所有概念性的实体,系统将这些实体作为资源公开,并为每个资源分配一个惟一的URI。但是,概念性的实体在该层是不存在的。它们存在于业务逻辑层。可以使用Jersey或其他框架(比如Restlet)实现Resource Request Handler,它应该是轻量级的,将大量职责工作委托给业务层。
Ajax和RESTful Web服务本质上是互为补充的。它们都可以利用大量Web技术和标准,比如HTML、JavaScript、浏览器对象、XML/JSON和HTTP。当然也不需要购买、安装或配置任何主要组件来支持Ajax前端和RESTful Web服务之间的交互。RESTful Web 服务为Ajax提供了非常简单的API来处理服务器上资源之间的交互。
图 1 中的Web浏览器客户端作为GUI的前端,使用表示层中的Browser Request Handler生成的HTML提供显示功能。Browser Requester Handle可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器做出响应。表示供用户在浏览器中显示使用。表示不仅包含内容,还包含显示的属性,比如 HTML和CSS。
业务规则可以集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。从业务逻辑层中解耦Browser Request Handler和Resource Request Handler有助于促进代码重用,并能实现灵活和可扩展的架构。此外,由于将来可以使用新的REST和MVC框架,实现它们变得更加容易,无需重写业务逻辑层。
数据访问层提供与数据存储层的交互,可以使用DAO设计模式或者对象-关系映射解决方案(如Hibernate、OJB或iBATIS)实现。作为替代方案,业务层和数据访问层中的组件可以实现为EJB组件,并取得EJB容器的支持,该容器可以为组件生命周期提供便利,管理持久性、事务和资源配置。但是,这需要一个遵从Java EE的应用服务器(比如JBoss),并且可能无法处理Tomcat。该层的作用在于针对不同的数据存储技术,从业务逻辑中分离数据访问代码。数据访问层还可以作为连接其他系统的集成点,可以成为其他Web服务的客户端。
数据存储层包括数据库系统、LDAP服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。使用该架构,您可以开始看到RESTful Web服务的力量,它可以灵活地成为任何企业数据存储的统一API,从而向以用户为中心的Web应用程序公开垂直数据,并自动化批量报告脚本。
结束语
REST描述了一个架构样式的互联系统(如Web应用程序)。REST约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过HTTP直接传输数据的特性,RESTful Web服务成为基于SOAP服务的一个最有前途的替代方案。用于web服务和动态 Web 应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax和RESTful Web服务本质上是互为补充的。开发人员可以轻松使用Ajax和RESTful Web服务一起创建丰富的界面。
本文是一篇率先演示如何使用文中介绍的多层架构构建RESTful Web服务和动态Web应用程序的文章。它提供了REST Web服务、Ajax和Spring Web Flow如何一起生成类桌面富 Web界面的示例。该教程使用Jersey、Spring、MySQL和Tomcat。它在 Eclipse中配置和实现。
根据与the University Corporation for Atmospheric Research的联合协议,National Science Foundation的研究为本文提供了依据。National Center for Atmospheric Research由National Science Foundation发起。此外,我还要感谢来自NCAR的Markus Stobbs,他提供了很多好建议并负责编辑了本文。
参考资料
获取有关Jersey的更多信息。
“Architectural Styles and the Design of Network-based Software Architectures”描述了一个框架来使用架构样式理解软件架构,并演示了如何使用样式指导基于网络的应用程序软件的架构设计。
RESTful Web Services描述了如何利用可编程应用程序的Web功能。
“Implementing RESTful Web services in Java” 介绍如何编写遵从JAX-RS: Java API for RESTful Web Services (JSR-311) 规范的RESTful web服务。
developerWorks Web development专区:通过专门关于Web技术的文章和教程,扩展您在网站开发方面的技能。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
API开发与管理大作战
2014将会是API管理方法新旧PK的一年,据Delyn Simons说,她领导了Mashery开发者的外展团队。应用编程接口(API)的主流化和私有化在新的一年也将掀起波澜,她在波士顿“Future Insights Ultimate Developer Event 2013”大会上预测说。
-
公共API外包管理是否值得考虑?
公共API外包管理是指聘请一个专家小组来解决可扩展性问题,同时也提出几套可替代的方案。
-
最适合大数据应用的是SOA还是REST?
跟所有的企业数据一样,大数据唯有通过应用投射给用户才有用。对于设计或重新设计大数据应用的架构师来说,一个关键问题是究竟是用SOA还是RESTful的API?
-
弹性资源对传统的REST架构构成挑战了吗?
组件化应用程序需要机制来将组件传递到下一个工作地。从一开始,人们对连接流程及其实施就有不同的观点。可以证明,SOA阵营是由RPC和SOAP的软件接口发展而形成的。