IBM WebSphere sMash 簡介,第 1 部分: 爲 Web 應用程序構建 RESTful 服務

IBM WebSphere sMash 簡介,第 1 部分: 爲 Web 應用程序構建 RESTful 服務

使用強大且簡單的平臺創建、組裝和部署現代應用程序

developerWorks
文檔選項
將打印機的版面設置成橫向打印模式

打印本頁

<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.zip 10KB HTTP
關於下載方法的信息


參考資料

學習

獲得產品和技術

討論


作者簡介

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 資深技術人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章