1 背景概述
因爲在項目中須要屢次調用webservice服務,本文主要總結了一下java調用WebService常見的6種方式,即:四種框架的五種調用方法以及使用AEAI ESB進行調用的方法。
java
2 預期讀者
數通暢聯內部員工web
廣大計算機愛好者數據庫
3 名詞解釋
Web Service也叫XML Web Service: WebService是一種能夠接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通信技術。是經過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,並經過UDDI進行註冊。
XML:(Extensible Markup Language)擴展型可標記語言。面向短時間的臨時數據處理、面向萬維網絡,是Soap的基礎。
Soap:(Simple Object Access Protocol)簡單對象存取協議。是XML Web Service 的通訊協議。當用戶經過UDDI找到你的WSDL描述文檔後,他經過能夠SOAP調用你創建的Web服務中的一個或多個操做。SOAP是XML文檔形式的調用方法的規範,它能夠支持不一樣的底層接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用於說明一組 SOAP 消息以及如何交換這些消息。大多數狀況下由軟件自動生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。在用戶可以調用Web服務以前,必須肯定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI利用SOAP消息機制(標準的XML/HTTP)來發布,編輯,瀏覽以及查找註冊信息。它採用XML格式來封裝各類不一樣類型的數據,而且發送到註冊中心或者由註冊中心來返回須要的數據。
瀏覽器
4 實現思路
經過soapUI工具使用四種WebService框架來生成客戶端代碼進行調用,或者使用Xfire的jar包中的的Client類進行調用,無需生成客戶端代碼,還能夠使用AEAI ESB工具中的soup調用組件進行調用。
服務器
5 實現步驟
5.1 工具材料
soapUI是一個開源測試工具,經過soap/http來檢查、調用、實現Web Service的功能/負載/符合性測試。該工具既可做爲一個單獨的測試軟件使用,也可利用插件集成到Eclipse,maven2.X,Netbeans 和intellij中使用。框架
axis全稱Apache EXtensible Interaction System 即阿帕奇可擴展交互系統。Axis本質上就是一個SOAP引擎,提供建立服務器端、客戶端和網關SOAP操做的基本框架。工具
Axis2是下一代 Apache Axis。Axis2 雖然由 Axis 1.x 處理程序模型提供支持,但它具備更強的靈活性並可擴展到新的體系結構。
Apache CXF = Celtix + XFire,開始叫 Apache CeltiXfire,後來改名爲 Apache CXF 了,如下簡稱爲 CXF。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,而且提供了多種 Binding 、DataBinding、Transport 以及各類 Format 的支持,而且能夠根據實際項目的須要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。
XFire是新一代的Java Web服務引擎,XFire使得在JavaEE應用中發佈Web服務變得垂手可得。
企業服務總線(Enterprise Service BUS,ESB)主要做爲企業信息系統的「龍骨」來集成各業務系統,實現異構系統的互聯互通。瀋陽數通暢聯軟件技術有限公司推出的ESB產品命名爲AEAI ESB。
AEAI ESB主要包含三個模塊:服務器ESBServer、設計器ESBDesigner、管理控制中心。ESBServer是AEAI ESB的運行環境,基於定製的Tomcat 擴展開發,管理控制中心則是部署在ESBServer的Java Web應用,基於開發平臺構建的。ESBDesigner是基於Eclipse Plugin開發的圖形化、拖拽式的設計Web服務、消息流程的構建工具。
5.2 前置條件
使用AEAI ESB建立一個簡單的接口(具體方法參見AEAI ESB集成平臺技術手冊5.2.7):樣例中的web服務入參爲三個數字,出參爲三個數字相加獲得的和。
在soapUI中進行相關配置,如圖:
在附件中有Apache文件夾,將文件夾放到指定路徑下,在以下圖進行配置
將四種框架的地址填寫進對應的位置,還有jdk的位置,注意Xfire須要ANT的支持。
5.3 方法步驟
5.3.1 Axis框架
在soapUI的菜單欄中選擇Tools中的Axis 1.x選項
在(1)處填寫須要調用的web服務的URL
在(2)處填寫生成的客戶端代碼的位置
點擊(3)處按鈕生成客戶端代碼
在對應的路徑下找到代碼文件
將代碼拷貝到本身新建的 工程目錄下
注意:出現缺包的錯誤時,將Apache中對應框架的文件家中的lib包導入便可,新建一個Test類,其中對應的測試調用代碼以下:
public class Test { public static void main(String[] args)throws Exception { AddAllNum_ServiceLocator locator = new AddAllNum_ServiceLocator(); AddAllNumSoapBindingStub stub = (AddAllNumSoapBindingStub)locator.getAddAllNumPort(); System.out.println(stub.addNum("1", "2", "3")); } } |
運行結果:
5.3.2 Axis2框架
在soapUI的菜單欄中選擇Tools中的Axis 2選項,如圖:
在(1)處填寫調用的接口的URL
在(2)處填寫生成代碼的位置
在(3)處填寫包名
在(4)處注意經過adb模式進行生成
點擊(5)處的按鈕生成客戶端代碼
生成出來的代碼以及文件都添加到新建的調用服務的工程中
將生成的客戶端代碼放入到新建的工程中,導入對應框架的包
新建Test類,對應的調用代碼以下:
public class Test { public static void main(String[] args) throws Exception{ AddAllNumStub stub = null; stub = new AddAllNumStub(); AddAllNumStub.AddNum addNum = new AddAllNumStub.AddNum(); addNum.setNum1("1"); addNum.setNum2("2"); addNum.setNum3("3"); System.out.println(stub.addNum(addNum).getResult()); } } |
運行結果:
5.3.3 Cxf框架
在soapUI的菜單欄中選擇Tools中的CXF選項,如圖:
在(1)處填寫須要調用的URL
在(2)處填寫生成的代碼文件的位置
在(3)處填寫代碼的包名
點擊(4)處的按鈕生成客戶端代碼
將生成的代碼放到新建的工程中,導入CXF的包後在AddAllNum_Service.java中出現錯誤,將出錯的地方註釋,如圖
建立Test類,測試調用接口
對應的測試調用代碼以下:
public class Test { public static void main(String[] args) throws Exception { URL wsdlLocation = new URL("http://localhost:9090/TestWebServices/services/AddAllNum?wsdl"); AddAllNum_Service addAllNum_Service = new AddAllNum_Service(wsdlLocation); AddAllNum addAllNum = addAllNum_Service.getAddAllNumPort(); String result = addAllNum.addNum("2","3","4"); System.out.println(result); } } |
運行結果:
5.3.4 Xfire框架
在soapUI的菜單欄中選擇Tools中的XFire1.x選項,如圖:
在(1)處填入須要調用的web服務的URL
在(2)處填入生成客戶端代碼的位置
在(3)處填入生成的客戶端代碼的包名
在(4)處注意須要使用jaxb模式生成
點擊(5)處的按鈕生成客戶端代碼
將生成的代碼放到到新建工程下,導入Apache文件夾下的xfire-lib目錄下的包
建立Test類,對應的調用方法:
public static void main(String[] args) { AddAllNumClient addAllNumClient = new AddAllNumClient(); String result = addAllNumClient.getAddAllNumPort().addNum("1", "2","2"); System.out.println(result); } |
運行結果:
新建工程,引入XFire對應的jar包(Apache目錄下的xfire-lib目錄中的包),注意此時須要在接口服務端的AddNum文件中添加一段代碼
@SOAPBinding(style=Style.RPC) |
從新部署工程,以下:
在新建的工程中的Test類中的調用,以下圖:
對應的調用代碼,以下:
public class Test { public static void main(String[] args) throws MalformedURLException, Exception { String url = "http://localhost:9090/TestWebServices/services/AddAllNum?wsdl"; Client client = new Client(new URL(url)); String num1 = "2"; String num2 = "3"; String num3 = "4"; Object[] result = client.invoke("addNum",new Object[]{num1,num2,num3}); System.out.println(result[0]); } } |
運行結果:
5.3.5 Aeai Esb調用
首先在接口工程上右鍵,設置ESB應用
選擇WS引用,將WSDL的地址添加進去,解析名稱、生成代理
在MF服務目錄下建立http消息流程TestSoupWeb
選擇數據適配器
在JavaInvoker1組件中選擇擴展代碼,如圖:
public void invoke() throws AdapteException{ AddNum addNum = (AddNum) this.xgetVariable("addNum").getValue(); addNum.setNum1("1"); addNum.setNum2("2"); addNum.setNum3("3"); } |
SoapInvoker1組件選擇如圖:
而後HttpResponse節點選擇響應內容如圖:
在瀏覽器調用HttpRequest節點中的URL
運行結果:
6 附件及說明
Apache目錄:四種Web服務框架以及Ant工具
WebService目錄:Web服務接口
Test目錄:文檔中涉及的四種框架五種調用的樣例客戶端工程
Sqls目錄:AEAI ESB須要使用的數據庫文件
Jdk目錄:存放了soapUI配置時須要用到的JDK
WebService服務調用方法介紹文檔及相關介質 下載