`
xiangxingchina
  • 浏览: 520264 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

REST 基础(一):用于构建 RESTful Web 服务的多层架构

    博客分类:
  • ws
阅读更多

from:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/

REST(Representational state transfer)风格的 Web 服务作为传统 Web 服务(以 SOAP 为基础)的一种替代方式,以其轻量化、易于构建、无状态以及使用 HTTP 协议等优势受到了很多开发语言以及框架的重视。目前几乎所有的主流开发语言,如 Java,C++,C# 等都提供了开发 REST 风格应用的扩展包。

随着 Web 2.0 应用的逐渐流行,Web 应用间数据和服务的公开与集成被越来越多的人所重视。REST 风格的服务成为了很多人的首选,它可以很快速和简便地实现异构应用之间的数据交换,同时可以保证传输的速率和安全性。目前流行的 Atom 发布协议就是 REST 风格 Web 服务的一种具体实现。

由于它简便、轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案。在本文中,我们将概述 REST 和 RESTful Web 服务的概念,并将它们与基于 RPC-style/SOAP 的 Web 服务相比较。您还将学习有关使用 Java™ 框架构建 RESTful Web 服务的内容,以及使用共享多层架构构建 RESTful Web 服务和动态 Web 应用程序的内容。

简介

现代 Web 应用程序必须提供桌面风格(desktop-like)的富浏览器界面,对外部客户端应用程序使用 Asynchronous JavaScript and 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) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 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 Handler 可以使用 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 应用程序公开垂直数据,并自动化批量报告脚本。

分享到:
评论

相关推荐

    Restful使用多层体系结构构建REST风格的Web服务和动态Web应用程序

    在构建现代Web应用程序时,REST(Representational State Transfer,表述性状态转移)风格已经成为一种广泛采用的架构设计原则。RESTful API设计不仅简洁且易于理解,还提供了良好的可伸缩性和可维护性。本篇文章将...

    使用AngularJs ASP.NET MVC Web API EF构建一个多层SPA的例子

    Web API是ASP.NET的一个组成部分,专门设计用于构建RESTful服务。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,易于理解和实现。Web API提供了简单的方式来创建...

    基于REST架构风格的Web+20实现.pdf

    J2EE为开发者提供了构建多层企业级应用的平台,将业务逻辑分为不同的层(比如表示层、业务层和数据访问层),在这样的架构下实现RESTful服务可以充分利用J2EE的优势。 最后,文档提到的网址包含了对REST架构风格的...

    XML、Web服务和.Net框架

    - **REST支持**:.NET框架还支持构建RESTful Web服务,通过ASP.NET MVC或Web API等技术实现。 - **工具与库**:.NET框架为开发Web服务提供了丰富的工具和库支持,包括但不限于: - **System.Web.Services命名空间...

    Rest Webservice(英)

    RESTful Web Services 是一种遵循 REST 风格构建的 Web 服务。它提倡使用 HTTP 协议来实现客户端与服务器之间的交互,并强调通过 URL 来定位资源。RESTful Web Services 通常通过四种主要的 HTTP 方法 GET、POST、...

    movie-store:具有后端关系数据库的多层RESTful应用程序

    通过这个项目,开发者可以学习到如何构建一个完整的Web应用程序,包括数据库设计、RESTful服务实现、前端页面与后端交互等技能。对于初学者来说,这是一个很好的实践项目,能够提升Java Web开发的综合能力。同时,...

    restlet in actiin

    《Restlet in Action》是一本面向Java开发者介绍如何利用Restlet框架构建RESTful Web应用的专业书籍。本书详细介绍了Restlet框架的核心概念、设计原则以及实践技巧,并通过丰富的示例帮助读者掌握RESTful API的设计...

    Projets餐厅:Projet Web API多层en .Net

    - Web API是.NET Framework的一个组件,用于构建RESTful服务,它支持HTTP协议,便于创建能够通过Internet进行数据交互的应用程序。 - REST(Representational State Transfer)是一种软件架构风格,强调资源的表述...

    架构风格与基于网络的软件架构设计

    REST(Representational State Transfer)是一种用于描述分布式超媒体系统的软件架构风格。Fielding 强调 REST 的核心在于提高组件交互的可伸缩性、接口的通用性、组件的独立部署,并通过中间组件来降低交互延迟、...

    Tutorial - Using a REST DataSnap Server with an Application and FireDAC (draft copy).pdf

    创建DataSnap REST服务器应用程序需要开发者具有Delphi编程知识,熟悉FireDAC库的使用以及对RESTful Web服务有基本理解。同时,读者应该对HTTP协议、JSON格式和内存数据集TFDMemTable有所了解。通过完成此教程,...

    java web服务

    8. **RESTful架构**: REST(Representational State Transfer)是一种轻量级的Web服务设计风格,强调资源的表述和状态转移。在Java中,可以使用Jersey或Spring MVC来创建RESTful服务,通过HTTP方法(GET、POST、PUT...

    JavaEE环境下各类开发架构简介

    JavaEE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级应用的一个标准规范集,它提供了丰富的API和服务,使得开发者可以构建分布式、多层架构的Web应用程序。在JavaEE环境下,有多种常见的开发...

    ASP.NET_MVC_4_and_the_Web_API_-_Building_a_REST_Service_from_Start_to_Finish.pdf

    传统上,MVC 主要被用于构建 Web 应用程序,但在 ASP.NET MVC 4 中,微软进一步拓展了其功能,使其能够更好地支持 RESTful 服务的构建。 在 .NET Framework 的早期版本中,开发者主要依赖于 ASMX Web 服务或 .NET ...

    LPI2:Java EE 项目和 Web 服务

    Java EE,全称为Java Platform, Enterprise Edition,是Java平台针对企业级应用开发的版本,它提供了丰富的API和服务,用于构建分布式、多层架构的企业级应用。这个标题“LPI2:Java EE项目和Web服务”暗示我们将...

    JavaEE lessons for Geekbrains.zip

    REST是一种轻量级的架构风格,常用于构建Web服务和移动应用的后端。 8. **JTA(Java Transaction API)和JTS(Java Transaction Service)**:JTA定义了如何在分布式环境中进行事务管理,而JTS则是JTA的一种实现,...

    JavaEE examples (including JAX-RS, Wildfly Swarm,

    通过学习和研究这些示例,你可以深入理解JAX-RS的API使用,掌握如何构建RESTful服务。同时,Wildfly Swarm的使用将帮助你了解如何简化JavaEE应用的部署和管理,提升开发效率。这些示例对于初学者和有经验的开发者来...

    javaEE课件

    JavaEE(Java Platform, Enterprise Edition)是Oracle公司提供的一个用于开发企业级应用的软件平台,它基于Java语言,主要用于构建分布式、多层架构的企业应用程序。JavaEE不仅包含了基础的Java SE(Standard ...

Global site tag (gtag.js) - Google Analytics