IBM WebSphere sMash 简介,第 1 部分: 为 Web 应用程序构建 RESTful 服务

IBM WebSphere sMash 简介,第 1 部分: 为 Web 应用程序构建 RESTful 服务

使用强大且简单的平台创建、组装和部署现代应用程序

developerWorks
文档选项
<script type="text/javascript"></script>
将打印机的版面设置成横向打印模式

打印本页

<script type="text/javascript"></script>
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码

英文原文

英文原文


级别: 初级

Roland Barcia, 资深技术人员, IBM
Steve Ims, 资深技术人员, IBM

2008 年 9 月 18 日

在本系列中,将学习关于 IBM® WebSphere® sMash 的所有知识,它是一个创建、组装和执行基于当前 Web 技术的应用程序的简单环境。本文是本系列的第一篇文章,介绍了使您能够创建、组装和部署强大的 Web 应用程序的大量创新。了解 WebSphere sMash 如何由社区驱动,及其创建 RESTful Web 服务的约定。通过一个分步示例,向您介绍如何设置环境、创建 Zero 项目、构建 RESTful 服务来公开数据、测试应用程序,并导入示例应用程序来使用 RESTful 服务。
编辑注意:本文首次发表时基于一个孵化器项目 Project Zero 的代码。当时,名称 Project Zero 指的是代码和社区。这些代码现在可以通过称为 IBM WebSphere sMash 的产品获得。Project Zero 现在是 WebSphere sMash 的开发社区,并将继续为开发人员提供免费的平台,帮助他们使用本社区最新的构建版本、特性和支持开发应用程序。

简介

IBM WebSphere sMash 专注于根据面向服务架构(SOA)开发敏捷的 Web 2.0 应用程序。应用到 SOA 的 Web 2.0 允许 Web 工件扩展 SOA 的应用范围。可以将这看作是 RESTful SOA。(具象状态传输(REST)是一种架构样式)。

RESTful SOA 是 SOA 的一个子集,侧重于超文本传输协议(HTTP)和基本的 RESTful 原则。RESTful SOA 提倡使用曾使 Web 大获成功的设计模式;遵从这种模式进行应用程序设计非常有意义,并且对大家都有好处。这些好处包括:

  • 可伸缩性,通过缓存和无状态交互实现。
  • 简单性,其前提条件是使用典型的 HTTP 和 XML 或 JavaScript Object Notation(JSON)来解析和呈现。
  • 源于共同标准的广泛 “网络效应”。比如,站点可以使用和聚合 Atom 或 RSS 提要,而无需知道关于内容的更多细节。

 

WebSphere sMash 引入了一种简单环境,用于创建、组装和执行基于流行的 Web 技术的应用程序。WebSphere sMash 环境包括 Groovy 和 PHP 脚本运行时,且具有应用程序编程接口,这些接口针对 REST 风格服务、集成 mashup 和 Web 接口的生成进行了优化。

WebSphere sMash 的目标既有技术方面的也有社会方面的。技术方面的目标是提供能在三个重要层面简化应用程序开发的可伸缩平台:

创建
利用对脚本语言(当前为 Groovy 和 PHP)的支持、能促使 RESTful 模式的约定以及可重用资源的编目简化开发。
组装
允许快速访问并将全异的服务集成到统一的应用程序,包括数据流、编排和自定义中介。
部署
基于稳定的 Java™ Virtual Machine (JVM) 提供一种以应用程序为中心的运行时环境,JVM 被优化以便进行敏捷开发(占用内存少,重启迅速)。

 

社会方面的目标与开发过程本身相关。WebSphere sMash 将会作为 社区驱动的商业开发(CD/CD)进入公领域。Project Zero 是 WebSphere sMash 的开发社区。用户社区能够参与并影响有关 WebSphere sMash 的技术决策。用户还能够直接接触到开发团队和源代码本身。这种程度的商业软件开发透明性在 IBM 还不多见;我们期望它能够带来高效的产出。

为了与 CD/CD 一致,所有有关 WebSphere sMash 的信息都可以在 projectzero.org 找到。本系列文章旨在对底层概念进行结构性介绍,并不揭示有关 WebSphere sMash 的最新信息。





回页首


RESTful 服务

REST 描述了可用来实现联网系统的一种设计模型。REST 既不是一种技术也不是一种标准;它是用来通过 Web 公开资源的一种架构风格。RESTful 架构遵从以下几个原则:

  • 请求是客户-服务器 式的,并很自然地使用一种基于拉的交互风格。对组件的使用会从服务器中拉出状态的表示。

     

  • 请求是无状态的。每个从客户端到服务器端的请求都必须包含理解此请求所需的全部信息,而且不能利用服务器上所存储的上下文。

     

  • REST 并不一定就意味着在中间层没有任何状态;为实现对某资源的请求的这个状态并不依赖于该状态。

     

  • 客户机和服务器都遵从统一的接口。所有的资源都可通过 Web 扩展的 SOA 世界中的普通接口进行访问 —— HTTP 及 HTTP 方法:GET、POST、PUT 和 DELETE。

     

  • 客户机与命名的资源进行交互。此系统由使用 URL(比如 HTTP URL)命名的资源组成。
具象状态传输(Representational State Transfer,REST)是面向分布式超媒体系统(例如 World Wide Web)的软件架构风格。

REST 是表示 Web 中的服务的关键技术。REST 在公开基于数据的服务方面效果最好,理解这一点非常重要。这些数据服务进而可以混合和匹配以便构建新的应用程序(通常称为 mashup)。如下的示例展示了客户机是如何对待 RESTful 服务的。

用 http://<host>/customer:

  • GET:返回客户列表
  • POST:创建客户记录

用 http://<host>/customer/roland:

  • GET:返回 Roland 客户记录
  • PUT:更新 Roland 记录
  • DELETE:删除 Roland 记录

在本例中,所公开的资源是 Customer。此 Customer 用 URI /customer 表示。特定的客户则通过在 Customer 之后追加标识符加以表示,例如 /customer/ims。HTTP 报头方法定义了访问此资源的意图。





回页首


对比以应用程序为中心和以服务器为中心的设计

在企业中,平台(比如基于 Java EE 的服务器)遵循以服务器为中心的原则。构建的 Web 应用程序被部署到应用服务器平台。服务器平台(比如 WebSphere)可以提供 Java EE 规范要求的各种服务质量。这些服务包括基于队列的消息、分布式事务或协议管理等。通常,应用服务器在同一个 JVM 上运行几个应用程序。架构师根据与其他应用程序共享软件和数据资源的理念设计应用程序,这是通过应用服务器提供的服务来实现的(但这些服务有时并不会被使用)。

尽管应用程序部署在独立的应用服务器中,服务器本身通常仍然装载了所有可用服务。应用服务器允许进行企业级集成。企业级集成的特征包括跨系统分布式事务、对关键数据交付使用基于队列的消息,或各种其他类型的服务。企业中的平台是围绕管理各种协议和中间件来设计的。有时它们与为许多应用程序提供服务的企业数据库进行交互。

Web 2.0 领域涉及到一系列不是很关键的 HTTP 级的集成。应用程序通常围绕一组数据进行设计,旨在将自己公开并与其他数据集结合,从而创建数据提供者都没有料到的新的应用程序。WebSphere sMash 的设计理念是以应用程序为中心。您构建并运行应用程序。您不会打包一个应用程序并将其部署到多应用服务器,就像另一个 JEE 容器内部的 WAR 文件一样。每个应用程序都在其自己的进程(JVM)中运行。

WebSphere sMash 运行时的寿命设计得很短,并且支持像在每次请求或空闲超时之后进行回收这样的模式。WebSphere sMash 是一个完整的堆栈

本系列第 2 部分将详细讨论此设计。
运行时。运行应用程序所需的所有东西都构建到进程中,包括 HTTP 堆栈。不需要外部代理或 Web 服务器,但集群和多应用程序路由需要使用外部代理。





回页首


WebSphere sMash 核心编程概念

WebSphere sMash 是一种新的、专门的平台的基础,这种平台与 Web 2.0 和 SOA 保持一致,以支持下一代基于 Web 的企业应用程序。本小节讨论一些核心概念。 开发人员指南 提供了关于这些概念的详细描述。

脚本编写和以 Java 作为系统语言

简化开发的一个重要趋势是脚本语言。WebSphere sMash 的目标是通过提供围绕脚本的简化应用程序编程接口(API)来帮助减少开发服务的负荷。默认的脚本语言是 Groovy,它基于的是 Java 并让 Java 程序员能够轻松转换到 Groovy。通过扩展模块,WebSphere sMash 也支持将 PHP 作为一种脚本语言。

事件

WebSphere sMash 是一种基于事件的系统。该系统的所有关键行为都以事件集及合适的事件状态的形式公开给应用程序。作为应用程序开发人员,您的主要的工作是通过提供可钩挂到已知的系统事件的处理程序集来获得所需的应用程序行为。标准事件对应用程序来说就是一些有意义的行为。

例如,此系统的一个 HTTP 请求可以能够引起一系列事件,您可针对这些事件编写处理程序。图 1 展示了这个概念,并且还包括了处理安全性方面问题的事件和特定的 HTTP 方法(比如 GET 或 POST)事件。有关事件处理的更多信息,请参阅 开发人员指南


图 1. 事件

您可以使用不同的方式编写事件处理程序,如 图 2 中的示例所示。如果使用的是脚本语言,比如 Groovy 或 PHP,那么您可能无需提供处理程序注册,因为 WebSphere sMash 提供了各种约定,能够减少甚至完全无需配置。您可以将脚本放置在某个目录中,WebSphere sMash 会自动将其注册为处理程序。

例如,图 2 中的脚本放置在一个称为 public 的目录中(作为 Web 服务根目录)。如果脚本文件名为 hello.groovy,那么用户就可以在 http://<host>/hello.groovy 上调用 HTTP GET。在 GET 事件发起时调用 onGET 处理程序。注意,图中的第一个脚本并不放置在一个事件处理程序方法中。因为它在 public 目录中,所以 WebSphere sMash 在响应 HTTP 方法时将调用这个脚本。本文稍后将讨论一些约定。


图 2. 事件处理程序示例

全局上下文

WebSphere sMash 中的事件处理程序没有显式的输入和输出参数,例如请求和响应。因为 WebSphere sMash 中的事件处理程序是无状态的,而且不能跨不同的调用保持同一个变量状态。WebSphere sMash 提供了全局上下文 来作为访问和维持所有状态的一种手段。全局上下文提供了有关应用程序当前事件的所有有趣数据,此外还包括了在应用程序的组件间存储和共享这些信息的机制。

全局上下文被划分成几个区,每个区都保存具有不同可见性和不同生命周期的数据,如图 3 所示。例如,User 区保存的是给定客户的会话状态,只对该客户可见,而且会保持此数据直到用户变为不活动的。

Request 区保存的是当前活动请求的状态,只对为该请求而执行的组件可见,而且此状态只会保持到该请求结束。


图 3. 全局上下文

在 WebSphere sMash 中有 7 个区。一些区是非持久化的,如表 1 所示。它们只存在于内存中,重启时将消失。


表 1. 非持久化的区
描述
Config/config 区中的数据将从配置文件加载。数据是全局可见的,并且在应用程序的整个生命周期中是可用的。可能会修改 Config 区,但当从配置文件重新初始化内容时,JVM 重启时会丢失更改。
Request/request 区中的数据对处理 HTTP 请求的线程是可见的。request 区从请求进入系统到响应发出期间是可用的。

您可能熟悉 servlet 编程,其中的 Request 区提供了 HttpServletRequest 和 HttpServletResponse 提供的功能组合。它包括对传入数据(请求参数、头、cookie、POST 体和输入流)和传出数据的访问(输出头、输出 cookie 和输出流)。

Event/event 区中的数据对于在事件持续期间处理事件的线程是可见的。WebSphere sMash 提供一个事件处理框架,可以使松散耦合的组件发布和订阅这些事件。

如果将一个事件发送给多个事件处理程序,则所有事件处理程序都可以从 event 区访问原始事件数据。

Tmp/tmp 区中的数据对应用程序的所有线程是全局可见的。它为应用程序存储对象提供了一个暂存区。

有了持久化区之后,如表 2 所述,这些数据就不会因重启而的丢失。


表 2. 持久化区
描述
User/user 区中的数据对 HTTP 会话的所有线程是可见的。HTTP 会话由请求中的 zsessionid cookie 的值来标识。user 区能够跨服务器周期保持。这个区的内容使用 Java 序列化进行序列化处理;只能将可序列化的对象放在其中。

HTTP 会话在一定时间不活动后就会超时。空闲超时通过在 zero.config 设置 /config/userZoneIdleTimeout 来配置。在 zsessionid cookie 过期之后,会话也会超时无效。

App/app 区中的数据对于应用程序的所有线程都是全局可见的。它提供一个暂存区供应用程序存储可序列化的对象。这个区能够保持多个服务器周期。
Storage/storage 区中的数据对于应用程序的所有线程是全局可见的。它提供了一个暂存区供应用程序存储序列化为 JSON 类型的数据对象,包括 List、Map、String、Double、Long、Boolean 和 null。这个区能够保持多个服务器周期和重启。

全局上下文对于应用程序的所有部分都是可用的。访问的方法取决于所使用的语言。GlobalContext 的 Java API 定义访问特征。Groovy 和 PHP 为这个 API 提供绑定。例如,request 变量被绑定到 request 区,这意味着可以使用点号(比如 request.myData)来访问 request 区中的 myData。全局上下文就像通过键值对进行访问的映射。您可以从全局上下文中获取、放置、列出和删除键。图 4 显示了一些示例,展示了事件处理程序如何访问 GlobalContext


图 4. 访问全局上下文

全局上下文支持 值路径,它直接访问某个对象类型。例如,可以通过 zget("/request/myList#3") 访问列表元素,或使用 zget("/request/myMap#key") 访问映射内部的 key 的值。





回页首


约定和应用程序的目录结构

WebSphere sMash 环境提供了几个约定,可以大大地简化 WebSphere sMash 应用程序的开发和减少所需指定的配置信息。WebSphere sMash 的目标之一是拥有尽可能少的配置信息。某些约定非常常见,而且也在意料之中。例如,可以将应用程序的 脚本放在公共文件夹内,并运行该脚本来不带配置地响应某个 HTTP 资源。图 5 展示了一个名为 hello.groovy 的脚本示例,它的每个 GET 事件都有一个事件处理程序。当针对 http://<application_host>/hello.groovy 调用 GET 时,将执行这个脚本。


图 5. 公共目录

其他的约定则针对于特定的某个模式。图 6 显示的是将名为 incentive.groovy 的 Groovy 脚本存储在某个特定文件夹下的例子。这种方式会自动将这些方法注册在此文件夹中以响应 HTTP REST 事件。在本文稍后的内容中,还会介绍如何使用 RESTful 模式快速开发 RESTful 服务以公开数据。


图 6. RESTful 资源的虚拟目录

在您构建示例的过程中,本文解释了各种虚拟化目录和应用程序目录。要获得更多的信息,请参考 开发人员指南 的 “虚拟化目录” 小节。





回页首


示例场景

现在您就可以使用 WebSphere sMash 平台构建自己的第一个 RESTful 服务了。但是,本小节首先将概述用于本系列文章的场景。

要求

贯穿本系列,将通过构建一个公共的示例来展示各种不同的概念。本场景的主题是能源。客户希望在能源上省钱,而能源提供商根据特定的能源模式提供折扣激励因素。能源使用者可以是房主、公司或其他实体。例如,一家国际公司希望构建一个快速的情景应用程序,帮助他们查找适合的能源激励因素。他们希望构建一个能够实现因特网搜索的 Web 应用程序,以为他们在全球各地的数据中心查找可行的能源激励方案。

为了让客户能够查找到能源激励方案,能源提供商必须能够通过因特网提供这些方案的数据。RESTful SOA 在这里扮演了重要的角色。以 RESTful 的方式发布内容使其他人能够创建新的应用程序来利用这些数据。图 7 展示了这个系统的用例图。


图 7. 用例图

在本文中,您将担任能源提供商的角色 NJEnergy。您将使用 WebSphere sMash 来发布和管理折扣激励数据。

数据模型

NJEnergy 拥有一个包含折扣激励数据的数据库表,如图 8 所示。


图 8. 激励因素表

它的目标是构建一个用来公开数据的 WebSphere sMash 应用程序。

设计 RESTful 服务

列出数据集之后,就可以开始将数据映射到 RESTful 名称空间。通常,为映射某资源而针对此特定条目创建一个表的做法非常有用。表 3 给出了到示例资源的 RESTful 映射。您将亲自构建此 RESTful 服务。


表 3. 折扣优惠 REST 端点
资源URI 方法 表示描述
Incentive list /incentive GET 对象的 JSON 数组和 Atom 提要获取折扣优惠方案列表
Incentive /incentive POST JSON 对象 创建一个新的折扣优惠方案
Incentive /incentive/<incentiveId> GET JSON 对象 获取单个折扣折优惠方案
Incentive /incentive/<incentiveId> PUT JSON 对象 更新单个折扣优惠方案
Incentive /incentive/<incentiveId> DELETE  删除单个折扣优惠方案

这里选择 JSON 表示数据格式,这是因为我们将会使用富 Internet 应用程序(RIA)作为系统的前端。对于折扣优惠列表,还必须提供 Atom 提要。很多基于 Ajax 的工具箱都能很好地理解 JSON,因为 JavaScript 是浏览器内面向 Ajax 的主要编程语言(有关 JSON 的更多信息,请参见 参考资料)。

RESTful 服务的安全

在定义服务之后,您可以为其附加服务质量。非功能性需求的样式和大小都不一样(“Why do non-functional requirements matter?” 提供了一个处理非功能性需求的实用方法)。具备提供基于 HTTP 服务的 REST 之后,应用非功能性需求就变得很简单了。

这个示例处理安全性问题,这意味着您将通过保护 URL 把安全规则应用到 REST 资源。表 4 展示了重点强调安全问题的 REST 表示例。


表 4. 安全
资源URI 方法 角色实例级别的安全
Incentive /incentive POST 管理员是:提供商只能处理他自己的折扣优惠方案。
Incentive /incentive GET 所有
Incentive /incentive/<incentiveId> GET 所有
Incentive /incentive/<incentiveId> PUT 管理员是:提供商只能处理他自己的折扣优惠方案。
Incentive /incentive/<incentiveId> DELETE 管理员 是:提供商只能管理他自己的折扣优惠方案。
Incentive /incentive?location=<input> GET 所有
其他资源 /<Anything Else> 所有没有 
     

先决条件

要运行本文的示例,您需要:





回页首


用 WebSphere sMash 构建第一个 RESTful 服务

在本小节中,您将启动应用程序构建器、检查一些工件、添加一些依赖项,以及为您的数据库创建一个配置条目。

启动应用程序构建器创建应用程序

本文以前版本的 Project Zero 使用 Eclipse 插件。在现在这个版本中,您的 WebSphere sMash 将使用基于 Web 的应用程序构建器(AppBuilder)。

  1. 为了启动 AppBuilder,请转到命令提示符并发出一个命令。
    1. 您可以转到终端窗口(比如 MAC 的 iTerm 或 Windows 的 CMD 提示符)启动 AppBuilder。转到解压缩 zero 的目录并运行命令 appbuilder open(或 ./appbuilder open)。图 9 展示了使用 MAC 的 iTerm 的示例。

      如果是第一次运行 AppBuilder,WebSphere sMash 运行时将从 projectzero.org 下载必要的组件来运行 AppBuilder。这只在第一次运行 AppBuilder 时出现。



      图 9. 终端窗口

    2. 在命令结束之后,Firefox 将自动打开 http://localhost:8070。这是 AppBuilder 的位置。AppBuilder 本身是一个 WebSphere sMash 应用程序。图 10 展示在 Firefox 内部启动的 AppBuilder。

      图 10. AppBuilder

  2. 启动 AppBuilder 之后,您可以创建新的应用程序了。
    1. 选择 New Application,如图 11 所示。将其命名为 NJEnergy。保持默认的根目录,并确保模式组是稳定的。您可以输入描述,这是可选的。选择 Create

      图 11. 创建一个名为 NJEnergy 的新应用程序

    2. 您将在列表中看到 NJEnergy。单击 NJEnergy,如下所示。

      图 12. NJEnergy 应用程序

应用程序工件

在构建应用程序之前,我们先看看应用程序的一些工件。您将使用 AppBuilder explorer 视图,它可以检查应用程序目录和文件。

图 13 展示了这个应用程序的布局并解释了里面的文件夹。这里有几个目录。app 文件夹包含几个存储脚本的子文件夹。根据不同子文件夹,WebSphere sMash 将应用几个约定。例如 /app/resources 目录用于通过脚本创建 RESTful 服务。config 目录包含几个配置文件。


图 13. 应用程序布局

依赖项

首先,将一些依赖项添加到您的应用程序。WebSphere sMash 使用来自 Apache Ivy 的技术。ivy.xml 文件存储在 config 目录中,依赖项也保存在这里。您可以自己编辑该文件,但本示例使用 AppBuilder 的依赖项页面。

WebSphere sMash 借助 Ivy 使用存储库表示法,分为本地和远程两种。WebSphere sMash 应用程序将声明一组依赖项。运行时通过 Ivy 技术查看本地存储库中是否存在依赖项。如果不存在,它将从远程存储库下载。默认情况下,远程存储库位于 projectzero.org。但是您可以配置不同的远程存储库。例如,当您首次运行 AppBuilder 时,sMash 运行时将下载所需的依赖项。Ivy 还支持基于版本的下载。例如,通过指定 1.0.0.0,2.0.0.0 告诉 WebSphere sMash 获取 1.0.0.0 和 2.0.0.0之间(不含这两个数值本身)的最新版本。

AppBuilder 提供从本地或远程存储库添加依赖项的工具。

  1. 选择 Dependencies 将看到一个框,它列出了应用程序的依赖项。这是直接从 ivy.xml 读取的。选择 Add

    图 14. 依赖项

  2. 现在输入 zero.data。确保选择了 Latest major version for Filter By,然后选择 zero.data 包。

    图 15. 添加依赖项

  3. 以相同的方式添加两个依赖项:
    1. zero.atom(用于创建 Atom 提要的 sMash 库)
    2. derby(用于连接到 Apache Derby 数据库的嵌入式版本的驱动程序)

    现在您的依赖项应该类似于图 16。



    图 16. 添加更多的依赖项

  4. 切换到 explorer 选项卡。在 config 目录下打开名为 ivy.xml 的文件。您将看到列出在这个 XML 文件的 <dependencies> 部分的所有依赖项。

    图 17. ivy.xml

配置

WebSphere sMash 的目标是通过约定减少创建应用程序所需的配置。但是配置数据库和安全规则等有时还是需要的。在本小节,您将为您的数据库创建一个配置条目。

在 WebSphere sMash 中,配置是在 zero.config 文件中完成的。正如前面了解到的一样,所有数据都存储在全局上下文中(由几个区组成)。您将在全局上下文的 config 区创建配置数据。在这里,您将为数据库创建配置数据。zero.config 文件包含针对 WebSphere sMash 应用程序的配置。

  1. 选择 File Editor 选项卡。在 All Files 下面,找到文件 zero.config 并选择它。

    图 18. zero.config

  2. 将配置文本添加到 zero.config 文件,如下所示(您可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/dbconfig.txt 中复制粘贴)。

    图 19. 数据库配置

现在需要创建数据库表和一些样例数据。WebSphere sMash 的目标之一是实现快速创建应用程序。实现的方法之一是通过使用 zero 命令行接口(CLI)。您可以使用命令行工具进行完整的 sMash 开发。您也可以运行和管理应用程序、管理 Ivy 存储库等。WebSphere sMash AppBuilder 有一个可以输入命令的控制台视图。命令的格式是 zero <task> <options>

WebSphere sMash 提供运行数据库脚本的任务。您将使用 zero 命令行运行数据库脚本。

  1. File Editor 的内部,在 Recent Files 下面选择 New File -> Other

    图 20. 新文件

  2. 将文件命名为 /sql/dbscript.sql,如下所示。

    图 21. dbscript.sql

  3. 添加 SQL 文本,如图 22 所示(您可以从 下载 文件的 <download_root>/sMashArticle/Part1/dbscript.txt 复制粘贴)。

    图 22. SQL 脚本

下一个步骤是转到 AppBuilder 的控制台视图,然后运行用于运行数据库脚本的 zero 任务。

  1. 选择 Console 选项卡,然后选择 Command Prompt

    图 23. 命令行提示

  2. 输入命令 zero runsql NJDB sql/dbscript.sql runsql 命令采用的是数据库名称(已在 zero.config 中配置)和脚本名称。

    图 24. runsql 命令

  3. 您应该会看到类似如下的结果。

    图 25. 命令结果





回页首


创建一个 RESTful 资源

现在,您可以编写 Groovy 脚本来创建 RESTful 资源并将其放到 /app/resources 目录。在前面已经了解到,WebSphere sMash 是基于事件的,开发人员的任务是编写事件处理程序。现在有一个使用公共目录存储 Groovy 脚本的示例,这些脚本可能有事件处理程序,比如 onGET 或 onPOST 等。此外,还要记住专门的虚拟化目录的表示法,它允许一些默认的行为。

在本小节中,您使用 /app/resources 目录,它专门用于为 REST 服务创建资源。表 5 总结了 URI 模式和 HTTP 方法,以及发出了的哪些事件。URI 模式用于表示一个集合,比如折扣优惠方案。最常用的模式用黑体突出显示。


表 5. sMash REST 事件
URI 模式 HTTP 方法 sMash 事件描述
/resources/collection GET list 列出所有成员
 POST create 创建一个成员
 PUT putCollection 更新集合
 DELETE deleteCollection 删除集合
/resources/collection/{id} GET retrieve 获取一个成员
 PUT update 替换成员
 DELETE delete 删除成员
 POST postMember 发布一个成员

如果 URI 中的集合名是 incentive(http:<host>/resources/incentive),将在名为 incentive.<script-ext>(比如 incentive.groovy 或 incentive.php)的脚本中查找处理程序。因此,如果一个 GET 请求是 /resources/incentive 级别的,将发出一个 list 事件,并且 sMash 将在 incentive.groovy 或 incentive.php 内部查找 onList() 处理程序。如果 GET 请求是成员级别的,例如 /resources/incentive/3,将在 incentive.groovy 或 incentive.php 内部查找 onRetrieve() 处理程序。在成员级别上,sMash 将自动把 Id 放置到 GlobalContext,以及 Id 后面的其他 pathInfo。

sMash 还支持嵌入式资源,比如 /provider/<providerId>/incentive/<incentiveId>。您可以创建一个特定的 incentive.bnd 文件,用于指定嵌套关系。表 6 给出了资源请求的一些示例、处理程序信息,以及传入的事件数据。


表 6. 事件传递和事件数据
HTTP 方法 For URI ……在 app/resources/incentive.groovy 中调用方法……事件数据
GET /resources/incentive onList  
POST /resources/incentive onCreate zget(“/request/input”) // POST data
GET /resources/incentive/3 onRetrieve zget("/request/params/incentiveId")==3
DELETE /resources/incentive/3 onDelete zget("/request/params/incentiveId")==3
PUT /resources/incentive/3 onUpdate zget("/request/params/incentiveId")==3

要创建一个响应这 5 个资源事件的折扣优惠服务,必须先创建 RESTful 资源。

  1. 返回到文件编辑器,选择 New File -> New Resource in (/app/resources),如下所示。

    图 26. 新的资源

  2. 在 /app/resources 的末尾添加 incentive.groovy

    图 27. incentive.groovy

接下来,您需要编写一个事件处理程序来响应 list 事件。当客户机在 /incentive 上发出 HTTP GET 时会执行这个操作。

添加图 28 所示的代码(从 下载 文件的 <download_root>/sMashArticleSeries/Part1/onList.txt 中复制粘贴)。在这里,您使用 zero.data API 访问管理器(已在 zero.config 中配置),它将使用 zero.data API 执行 SQL 语句。查询的结果呈现为 JSON。这是在 sMash 中预定义的呈现器。如果需要一个自定义的呈现器,您可以在 /app/views 的内部存储一个模板,并传递实现该模板的脚本的名字。


图 28. onList

您可以快速运行和测试应用程序。

  1. 单击右上角的 Start,如图 29 所示。

    图 29. 运行应用程序

  2. 等待应用程序开始。AppBuilder 正在发出适当的 zero 命令来启动应用程序。您应该会看到一个表示应用程序开始的图标。

    图 30. 启动应用程序

  3. 单击 stop 按钮旁边的 application 链接。

    图 31. 打开应用程序

  4. 应该会看到一个新的浏览器选项卡或页面显示正在运行的应用程序。这里应该会显示一个默认的索引页面,如图 32 所示。您将使用 Firefox Poster 插件测试 RESTful 服务。选择 P 图标启动 Poster。

    图 32. 默认索引页面

Firefox Poster 是 Firefox 的一个良好扩展,可以测试 RESTful 服务,包括执行 POST、PUT 和 DELETE。您使用该工具来测试 RESTful 交互。

  1. 在 URL 中输入 http://localhost:8080/resources/incentive ,如下所示,并选择 GET

    图 33. Poster 中的 GET

  2. 您应该会看到折扣优惠的 JSON 列表。

    图 34. /resources/incentive 的结果

在此只是创建了一个获取折扣优惠方案 LIST 的 RESTful 资源。接下来,您将创建获取事件的处理程序。它将根据 URI 模式返回一个折扣优惠方案。

  1. 图 35 展示了 onRetrieve 处理程序(可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/onRetrieve.txt 复制粘贴)。在查询字符串的内部有一个访问全局上下文的 GString 变量。ID 存储在 request 区,如前所述。(zero.data API 在后台使用一个预备的语句)。

    图 35. onRetrieve

  2. 返回到 Firefox Poster 工具,现在可以测试 URI 了。输入 http://localhost:8080/resources/incentive/1 并选择 GET

    Figure 36. 测试 onRetrieve

  3. 您应该会得到图 37 所示的结果。

    图 37. onRetrieve 结果

到目前为止,您只是返回了 JSON 数据。在 Web 2.0 应用程序中,需要返回一个 Atom 提要。您需要更新 onList 方法来返回 Atom 提要。此外,您还需要提供列表的子集。

  1. 用图 38 所示的代码代替 onList 实现(可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/onListAtom.txt 复制粘贴)。注意事项:
    • 首先,使用 GlobalContext 查找查询参数。注意,您可以直接访问列表元素。
    • 在发出查询之后,代码检查格式元素的请求参数。如果存在该参数,就判断它是否是 atom。如果是,您可以使用 Groovy 脚本生成具有 Atom 字段的结构,并呈现这个结构。


    图 38. 返回 Atom 或 JSON 的 onList

  2. 转到 Firefox 浏览器并在另一个选项卡中输入 http://localhost:8080/resources/incentive?format=atom ,如下所示。

    图 39. Atom 结果

至此,已经编写了用于读的 GET 方法。现在您可以编写 POST、PUT 和 DELETE 方法了。

  1. 添加如图 40 所示的代码。你可以从 <root>/free 复制粘贴这些代码。(见 下载 文件的 <download_root>/sMashArticleSeries/Part1/updates.txt)。您将注意到一些事情。
    • 您还有一个用于创建、更新和删除的处理程序,它与 POST、PUT 和 DELETE http 方法对应,如前所述。
    • WebSphere sMash 具有 JSON 解码和编码方法。您可以轻易地从 GlobalContext 将 request.input[] 变量传递给解码方法,以获取输入的脚本表示(用 Groovy Map 表示 JSON 对象,用 Groovy List 表示一个数组)。
    • 数据作为一个 Groovy GString 传递给查询。
    • 您需要设置恰当的 HTTP 响应。


    图 40. 更新方法

  2. 返回到 Firefox Poster 工具,输入 URL http://localhost:8080/resources/incentive。在内容部分,输入 JSON 对象,如图 41 所示(可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/postInput.txt 复制粘贴)。

    图 41. 测试 POST

  3. 这应该会得到一个 204,表示更新成功。注意,位置标题的 URL 带有最新发布的条目。

    图 42. POST 响应

  4. 更改数据条目之一,比如名称。将在 POST URL(或将 ID 添加到末尾)复制到 Poster 输入中,并发出 PUT

    图 43. PUT 请求

  5. 有时受到防火墙的限制,可能无法发出 PUT。可以添加 X-Method-Override 标题,并将 Value 设置为 PUT,如图 44 所示,也可以通过 POST 执行 PUT。这只在 PUT 失败时使用。这应该会得到一个 204。您可以在相同的 URI 上发出一个 GET,确保更新是有效的。

    图 44. POST 覆盖

  6. 在相同的 URI 上发出 Delete

    图 45. Delete

  7. 这应该会得到一个 204,如图 46 所示。如果发出 GET,应该会得到一个 404,表示没有找到。

    图 46. Delete 结果

保护 RESTful 资源

构建 RESTful 应用程序时,应该考虑安全问题。在这个小节,您将为折扣优惠方案客户使用的 POST、PUT 和 DELETE 方法提供安全保护,因为他们已被授权访问提供商的应用程序。GET 允许客户通过因特网查找折扣优惠方案,因此它是不安全的。

安全规则是在 zero 配置文件中输入的。我们将使用默认的 security.config。但是,您可以将安全配置信息存储在另一个配置文件中,并在 zero.config 中包含它。

  1. 转到 File Editor。在 Recent Files 的下方,选择 zero.config 文件。

    图 47. zero.config

  2. 输入安全规则,如图 48 所示(可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/securityRules.txt 的 securityRules.txt 上复制粘贴)。注意以下几点:
    • 您已经包含一个用于获取需要的模式的默认规则配置。记得指定一个条件。对于这种情况,我们将查找匹配 HTTP 请求的 /resources/incentive,以及其后的以 (/*|?) 表示的所有东西和 HTTP 方法 DELETE、POST 或 PUT。这个信息存储在 GlobalContext 中,它在请求生命周期的安全阶段被调用。
    • 您将指定身份验证类型为 Basic。(WebSphere sMash 支持其他类型,比如 Form、Single Sign-on 或 Open ID。参阅 WebSphere sMash 开发人员指南 的 Security 部分)。然后您可以指定有权访问这个 URI 规则的 Groups、Users 或 Roles。指定一个特殊的组,它可以匹配任何经过验证的用户。


    图 48. 安全规则

  3. WebSphere sMash 提供一个默认的基于文件的注册表,这对开发非常有好处。在随后的部署中,可以切换到基于 LDAP 或基于定制的注册表。您可以使用 zero CLI 在默认的文件注册表中创建用户。

    转到控制台选项卡并选择命令提示选项。输入命令:zero user create admin passw0rd,如图 49 所示。



    图 49. 创建用户

  4. 得到的结果应该如图 50 所示。

    图 50. Zero 命令的结果

因为更改了配置,所以需要重启应用程序进行测试。

  1. 在右上角单击 Stop,如图 51 所示。

    图 51. 停止应用程序

  2. 单击 Run 启动应用程序。

    图 52. 运行应用程序

  3. 返回到 POSTER 工具,并向 http://localhost:8080/resources/incentive 发出 GET,如图 51 所示。GET 请求是不安全的,您应该像前面那样获取一个列表。

    图 53. 不安全的 GET

  4. 使用与前面一样的输入发出一个 POST 请求(这同样可以从 下载 文件的 <download_root>/sMashArticleSeries/Part1/securityRules.txt 的 postInput.txt 复制粘贴)。

    图 54. POST 请求

  5. 您将收到一个提示,要求输入用户和密码。输入 admin/passw0rd

    图 55. 安全提示

  6. 这应该会得到一个 204,并且创建了一个新的资源。您可以用类似的方法测试 PUT 和 DELETE。

    图 56. POST 的结果





回页首


结束语

本文是关于 Project Zero 的文章的更新。在本文中,您使用了 WebSphere sMash 的产品代码。本文介绍了一个产品并使您了解到 WebSphere sMash 遵循基于事件的架构。全局上下文是一种维护应用程序的所有阶段的方式。WebSphere sMash 是以应用程序为中心的,它提供了几个虚拟化目录,帮助您使用约定来减少应用程序中的配置。

您使用 WebSphere sMash 构建了用于公开折扣优惠数据的基于 REST 的应用程序。您还使用了新的 AppBuilder,它是基于 Web 的集成开发环境,用于构建 sMash 应用程序。最后,您学习了如何使用 sMash 安全规则为 RESTful 资源提供安全保护。

在下一篇文章中,您将通过构建客户应用程序深入了解 REST。您将使用另一个模式来构建调用 zero 资源模型(zero resource model,ZRM)的 REST 服务。此外,您还将开始使用 Dojo Toolkit 构建 RESTful 资源的富 Internet 客户机。






回页首


下载

描述名字大小下载方法
本文的样例sMashArticlePart1.zip10KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术

讨论


作者简介

Roland Barcia 的照片

Roland Barcia 是一名 IBM 资深技术人员和 IBM Software Services for WebSphere 的首席 Web 2.0 架构师。他还是 IBM WebSphere: Deployment and Advanced ConfigurationPersistence in the Enterprise 的合著者之一。


Steve Ims 的照片

Steve Ims 是一名 IBM 资深技术人

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值