消費 Web 服務
要消費 Web 服務,您必須首先創建服務調用存根。讓這些存根來執行任務,例如對輸入值和返回值進行編碼和解碼、與 JSR 172 運行時交互來調用遠程服務端點。存根通過運行時的服務提供者接口 (SPI) 與運行時進行交互,這樣通過概述運行時執行的詳細情況,使存根在不同廠商之間的執行更便捷。
存根通常是用工具生成的,該工具讀取一個 WSDL XML 文檔,文檔描述了將要使用到的 Web 服務。同樣的,WSDL 文檔通常也是通過工具生成的,該工具讀取接口定義,例如 Java 接口產生了 WSDL 文檔。
從我們移動開發的角度來看,需要消費的 WSDL 文檔通常已經存在,您需要做的僅僅是生成 JSR 172 WSA 存根。要生成這些存根,您應該使用例如 J2ME Wireless Toolkit 2.1 存根生成器這樣的工具,如下圖所示:
該生成器生成存根 Java 文件,以及相關的支持類。如下一部分所描述的,它還考慮到了 WSDL 到 Java 的數據類型映射。
一旦生成了 JSR 172 JAX-RPC 存根和支持文件,您的應用程序就已經被編譯並部署到啟用了 JSR 172 的設備上了,消費 Web 服務是很簡單的而且幾乎是透明的。您很快就會看到,調用遠程方法幾乎和調用本地方法一樣簡單。
JSR 172 JAX-RPC 子集 API JSR 172 遠程方法調用 API 是以基於 XML 的 RPC 的 J2SE Java API (JAX-RPC 1.1) 的子集為基礎的。它同樣遵守 WS-I 基本概要。下面來詳細研究一下 JSR 172 JAX-RPC 子集 API:
它支持:
SOAP 1.1。 任何可以傳送 SOAP 消息的傳輸,例如 HTTP 1.1,都有一個定義好的用於 SOAP 1.1 的協議綁定。 SOAP 消息的文字表示代表一個 RPC 調用或應答。下面(是)數據類型和相應的 Java 映射:
xsd:boolean 到 boolean 或 Boolean。
xsd:byte 到 byte 或 Byte。
xsd:short 到 short 或 Short。
xsd:int 到 int 或 Integer。
xsd:long 到 long 或 Long。
xsd:float 到 float,或 Float。對基於 CLDC 1.0 的平台,該數據類型映射到 String。
xsd:double 到 double,或 Double。對基於 CLDC 1.0 的平台,該數據類型映射到 String。
xsd:string 到 String。
xsd:base64Binary 到 byte[]。
xsd:hexBinary 到 byte[]。
xsd:complexType 到基本類型和類類型序列。
xsd:QName 到 Javax.XML.namespace.QName。
以 XML 數組模式為基礎的基本類型和復雜類型(結構中包含基本類型或復雜類型)數組。
它不支持:
帶附件的 SOAP 消息。
SOAP 消息處理器。
SOAP 消息的編碼表示。
服務端點(不是 Web 服務生產者)。
服務發現支持 (UDDI)。
設備端沒有規定 XML 編碼方法。這樣做是通過允許執行程序使用更有效的數據編碼方法來幫助減少網絡傳輸,例如在設備和無線網關間使用二進制協議(只要這樣編碼對消費者和生產者是透明的)。
JSR 172 遠程調用 API 包括下面這些包:
Javax.microedition.XML.rpc
Javax.XML.namespace
Javax.XML.rpc
Java.rmi (包括確保 JAX-RPC 相關型)
注意這些 API(有一些異常 API,例如 RemoteException)不是直接由應用程序調用,相反,應用程序調用生成的存根。上面的 API 主要是供存根使用的。