顯示具有 WebService 標籤的文章。 顯示所有文章
顯示具有 WebService 標籤的文章。 顯示所有文章

Spark - Java 輕量級的 Web 框架

這跟處理巨量資料的 apache spark 無關!

如果有時候只是要寫個沒幾個人用的 Restful API,或只是想要有個 HTTP 接口(透過 get/post)來呼叫我們寫好的 Java SE 程式,如果對架設 tomcat / Java EE Server 又不熟悉,那可以考慮用 Spark!

Hello World

Spark 2 以後需要用到 lambda 語法,需要安裝 Java 8。如果只有 Java 7,請找 Spark 1 或是去玩 play

以 Eclipse 為例,安裝 Spark 方法有兩種:

第一種比較簡單,直接建立 Maven 專案,在 pom.xml 加入對 spark 的 dependency 就好了。

第二種就到 github clone 下來,不過實際建立時,我還是得把這專案轉成 maven 專案,才能利用 pom.xml 把其他要用的 jar 檔抓回來...也可能我太笨沒抓到官方給的提示...

寫一個 HelloWorld.java 包含一個 main 如下:

import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

直接執行 HelloWorld.java,無需安裝另外的 Web Container,無需任何設定,在瀏覽器打開 http://localhost:4567/hello 就可以看到結果。

螢幕快照 2015-03-26 下午1.49.01

Spark 提供的功能

大部份 Restful API 需要的功能都有:
  • 指定 URL 路徑。
  • 存取 request 標頭/參數/...。
  • 回寫 response。
  • 處理 session。
  • 處理每個 request 前後插入 filter 做前置/後置處理。
除了單純回傳資料,也可以介接 Freemarker 這類的 HTML Template Engine,將要顯示的值以類似 JSP EL 的方式,填到預先寫好的 HTML Template 上。

也可以介接 AngularJS 做出類似 Gmail 這種只有一頁的 Web 網站。

部署

官網上沒有特別寫部屬的方式,試了一下。就直接在 Eclipse 上匯出一個可執行的 jar,執行的目標就指向有 main 的那支 java。

執行匯出的 jar 就會在本機上開啟 Web Server 了(參考下圖)!開發到使用完全就像執行一般 jar 一樣!

螢幕快照 2015-03-26 下午1.51.17

參考

Eclipse 產生 Web Service Client 問題排除

網路上 step by step 的文章已經很多了,這邊僅記錄我在 Eclipse + JBoss7 上產生 Client 遇到的問題。不定期更新(如果我還持續踩到雷的話)。

不支援 static array

編輯 WSDL 時,Eclipse 會回報以下錯誤。
Multiple annotations found at this line:
    - WS-I: (BP2108) An Array declaration uses - restricts or extends - the soapenc:Array type, or the 
     wsdl:arrayType attribute is used in the type declaration.
    - WS-I: (BP2102) An XML schema import element references something other than an XML 
     schema definition: the referenced element does not have "schema" from XML namespace "http://
     www.w3.org/2001/XMLSchema" as root element.
修改 WSDL ,改為 dynamic array style。

參考:

不支援 RPC / Encoded

編輯 WSDL 時,Eclipse 會回報以下錯誤。
WS-I: (BP2406) The use attribute of a soapbind:body, soapbind:fault, soapbind:header and soapbind:headerfault does not have value of "literal".

修改 WSDL ,將 encoded 改為 literal。雖然這樣修改能順利產生 Web Service Client 的程式碼,但最終還是要看 Web Service 的 Server 端能不能接受 literal 的 SOAP。
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace=http://foo/bar use="encoded"/>

<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace=http://foo/bar use="literal"/>

Eclipse 執行完成卻沒有產生任何程式碼

沒有產生程式碼,沒有任何報錯。

用 console 模式來產生程式碼,以 JBoss 7 為例,直接使用 ${jboss_home}/bin/wsconsume.bat 來產生程式碼,錯誤就能正確顯示。



參考:

惱人的 WSDL / SOAP Style

WSDL (Web Services Description Language) 在 WIKI 是這麼寫的:

WSDL描述Web服務的公共介面。這是一個基於XML的關於如何與Web服務通訊和使用的服務描述;也就是描述與目錄中列出的Web服務進行交互時需要綁定的協議和信息格式。通常採用抽象語言描述該服務支持的操作和信息,使用的時候再將實際的網路協議和信息格式綁定給該服務。
描述的很簡單,林北也以為很簡單,反正就不過是描述 SOAP 的格式,然後又有工具可以產生,隨便弄弄知道它是再做啥就好。弄下去才知道我錯了,基本上這根本不是給人看的東西,然後光標準就有五種類型,每個系統負責人都不知道自己產生的是哪一種 WSDL (大家都想說產出 WSDL 就沒自己的事情了),我這做 SOA 的光接這些不知名的 WSDL 就搞到快翻掉,踩雷踩太多次了,故整理起來自己以後好 google 恢復記憶。

使用方法很簡單,直接看圖顏色有高亮的地方來區別每個類型的不同處,至於優缺點可以直接參考下面的文章連結(英文)。扣掉 Document/Encoded 沒人用以外,剩下四種類型的 WSDL 和對應的 SOAP 格式請參考下圖(點圖可到 flickr 去下載原檔 960*720):

WSDL (紅字代表差異部分)
WSDL Style

SOAP (藍字代表 Operation 相關差異,紅字代表 Type Encoded 相關差異)
SOAP Style
參考:

SwitchYard - Web Service Proxy


SwitchYard 為 JBoss 下一代 ESB (Enterprise Service Bus) Framework,小弟沒玩過 JBoss ESB 所以就不多做比較了,至於 SwitchYard 的簡單介紹,等之後有時間或是有人問再考慮整理最近把玩的心得。

這裡實作一個簡單的範例,利用 SwitchYard 來橋接其他外部的 Web Service,實際上的用途可以用來橋接企業內部的所有系統服務 (ex: ERP、簽呈、產線相關...),全部接上 SwitchYard 這個 ESB 後,後續的企業程式開發,就可以只針對 SwitchYard 統整好的服務來引用。這樣的好處為可以減少應用程式與系統之間的耦合。


PS 1:投影片並非最終版本,還在細部修改中。
PS 2:Source Code on GitHub