加法服務
This document is provided as is. You are welcomed to use it for non-commercial purpose.Written by: 國立中興大學資管系呂瑞麟
請勿轉貼
在之前的範例中,我們開發了一個回傳字串的服務:TimeService。在這個 範例,我們將提供一個簡單的服務,該服務允許 client 傳給 service 兩個整數, 然後 service 將兩個整數加總後回傳。如果各位是好奇寶寶的話,其實你們可以 嘗試將服務改成其它資料型態、改成減法/乘法、或者攝氏轉華氏的服務等。 發布 AdditionService 服務的步驟整理如下:
- 撰寫 Addition.java 如下,並將 compile 好的 .class 檔放到
axis\WEB-INF\classes。
public class Addition { public Addition() { } public int addNumbers(int a, int b) { return a + b; } }
- 產生一個註冊用的 WSDD 檔,以我們的範例而言,這個 WSDD 檔的內容
如下,並假設這個檔案的名稱是 deploy-add.wsdd。
01 <deployment xmlns="http://xml.apache.org/axis/wsdd/" 02 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 03 04 <service name="AdditionService" provider="java:RPC" 04 style="wrapped" use="literal"> 05 <parameter name="className" value="Addition" /> 06 <parameter name="allowedMethods" value="*" /> 07 </service> 08 </deployment>
adminclient.bat deploy-add.wsdd
- 檢查該服務的 WSDL(尤其是比對 document/literal wrapped 的部分):
<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://DefaultNamespace" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="addNumbers"> <complexType> <sequence> <element name="in0" type="xsd:int"/> <element name="in1" type="xsd:int"/> </sequence> </complexType> </element> <element name="addNumbersResponse"> <complexType> <sequence> <element name="addNumbersReturn" type="xsd:int"/> </sequence> </complexType> </element> </schema> </wsdl:types> <wsdl:message name="addNumbersRequest"> <wsdl:part element="tns1:addNumbers" name="parameters"/> </wsdl:message> <wsdl:message name="addNumbersResponse"> <wsdl:part element="tns1:addNumbersResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="Addition"> <wsdl:operation name="addNumbers"> <wsdl:input message="impl:addNumbersRequest" name="addNumbersRequest"/> <wsdl:output message="impl:addNumbersResponse" name="addNumbersResponse"/> </wsdl:operation> </wsdl:portType>
- 測試 service 並檢查 SOAP 訊息:請在瀏覽器上,輸入 http://localhost:8080/axis/services/AdditionService?method=addNumbers&in0=7&in1=6。
剛剛輸入的 URL 有一個地方要注意一下:addNumbers 的兩個參數名稱為 in0 和 in1,
這兩個名稱是從 WSDL 內決定的。執行後,service 回傳的 SOAP 訊息如下:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <addNumbersResponse xmlns=""> <ns1:addNumbersReturn xmlns:ns1="http://localhost:8080/axis/services/AdditionService">13</ns1:addNumbersReturn> </addNumbersResponse> </soapenv:Body> </soapenv:Envelope>
- 利用 WSDL2Java 來產生所需要的 proxy 類別,並開發 client 程式如下:
import java.rmi.*; import javax.xml.rpc.*; import javax.swing.*; import localhost.axis.services.AdditionService.*; public class AddClient { public static void main(String[] args) throws RemoteException, ServiceException { AdditionService service = new AdditionServiceLocator(); Addition call = service.getAdditionService(); String input = JOptionPane.showInputDialog("第一個整數"); int num1 = Integer.parseInt(input); input = JOptionPane.showInputDialog("第二個整數"); int num2 = Integer.parseInt(input); int result = call.addNumbers(num1, num2); System.out.println("總合 = " + result); } }
Written by: 國立中興大學資管系呂瑞麟
沒有留言:
張貼留言