Apache SOAP 是 Axis 之前的前身專案,雖然已停止維護,但在理解早期 Java Web Service 發展歷程、維護極舊系統時仍有參考價值。本文記錄在 Tomcat 4.0.4 上部署 Apache SOAP 2.3.1 並執行簡單 RPC 呼叫的完整步驟。
C:\soap-2_3_1。C:\Program Files\Apache Tomcat 4.0。C:\soap-2_3_1\webapps\soap.war 到 C:\Program Files\Apache Tomcat 4.0\webapps\ 目錄下。C:\soaptest 與 C:\soaptest\classes。CLASSPATH,加入 C:\soaptest\classes\test.jar。startup.bat 或透過服務管理工具啟動)。package test;
public class SimpleMath {
public double getSinValue(double input) {
double ret = Math.sin(input);
return ret;
}
}
package test;
import java.io.*;
import java.net.*;
import java.util.*;
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
public class SimpleMathClient {
public static void main(String[] args) throws Exception {
System.err.println("SOAP call testing");
double value = Math.random();
SimpleMathClient smc = new SimpleMathClient();
double returnValue = smc.doRequest(value);
System.err.println("the sin value of " + value + " is: " + returnValue);
}
public double doRequest(double value) throws Exception {
Call call = new Call();
call.setTargetObjectURI("urn:test.math.sin");
call.setMethodName("getSinValue");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector params = new Vector();
params.addElement(new Parameter("input", double.class, new Double(value), null));
call.setParams(params);
Response resp = call.invoke(new URL("https://127.0.0.1:8080/soap/servlet/rpcrouter"), "");
if (resp.generatedFault()) {
Fault fault = resp.getFault();
System.out.println("the call failed: ");
System.out.println(" Fault Code = " + fault.getFaultCode());
System.out.println(" Fault String = " + fault.getFaultString());
return 0.0d;
} else {
Parameter result = resp.getReturnValue();
return ((Double) result.getValue()).doubleValue();
}
}
}
cd c:\soaptest
javac -d classes *.java
cd classes
jar -cvf test.jar test
https://localhost:8080/soap/admin/index.html。urn:test.math.sinRequestgetSinValueJavatest.SimpleMathNOcd c:\soaptest
java test.SimpleMathClient
若主控台輸出類似 the sin value of 0.123456 is: 0.123123 的數值,代表配置與測試成功。此後即可依此模式發布自訂 SOAP 服務。
/soap/servlet/rpcrouter 是 SOAP 處理所有 RPC 請求的端點。Constants.NS_URI_SOAP_ENC 表示 SOAP Section 5 編碼規則。resp.generatedFault() 判斷遠端呼叫是否拋出錯誤。Apache SOAP 雖已成為歷史,但其「部署描述檔 + 管理介面 + RPC Call 物件」的設計雛形,直接影響了後來 Axis 甚至 JAX-WS 的架構風格。理解這套流程有助於掌握 Java Web Service 技術演進的脈絡。