首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 中的 SOAP 技術實戰:從原理到 HelloWorld 完整部署

     編輯:Java 相關知識

前言:為什麼需要 SOAP?

早期分散式系統採用 DCOM、CORBA (RCP) 進行遠端呼叫,但這些協議在網際網路環境面臨防火牆阻擋、跨平台困難、安全性複雜等問題。SOAP (Simple Object Access Protocol) 基於 XML + HTTP,穿透防火牆、跨語言跨平台、人類可讀,成為 Web Services 的基石協議。

SOAP 運作核心架構

SOAP 運作架構

四大關鍵角色

  1. SOAP Client:發起呼叫,序列化參數為 SOAP Envelope
  2. SOAP RPC Router (Servlet):接收 HTTP 請求,解析 Envelope,路由至對應 Service
  3. SOAP Service:實際業務邏輯實作 (POJO)
  4. SOAP Admin Tool:部署/管理 Service 映射 (URN → 類別)

SOAP Envelope 結構

SOAP Envelope 結構

Envelope → Header (可選) + Body (必選,含方法呼叫/回應/錯誤)

環境建置清單

元件版本來源
JDK1.4.1+Sun/Oracle
Servlet 容器Tomcat 4.1.29+Apache Jakarta
Apache SOAP2.3.1Apache XML Project
JavaMail1.3.1Sun (MTOM/附件支援)
JAF1.0.2Sun (JavaMail 依賴)
Xerces2.6.0Apache XML Parser

關鍵 CLASSPATH 設定 (Tomcat bin/setclasspath.bat)


set CATALINA_HOME=C:\Tomcat4.1.29
set CLASSPATH=%JAVA_HOME%\lib\tools.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\soap-2.3.1\lib\soap.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar

完整 HelloWorld 實戰

步驟 1:撰寫 Service 端業務類別


// HelloWorld/SOAPService.java
package HelloWorld;
public class SOAPService {
    public String sayHi(String x) {
        return "Hello my friend, " + x + "! Glad to see you!";
    }
}

# 編譯
javac HelloWorld/SOAPService.java
# 確保 HelloWorld 目錄在 CLASSPATH 中

步驟 2:透過 Admin Tool 部署 Service

  1. 啟動 Tomcat,瀏覽 https://localhost:8080/soap/
  2. 點擊 Run the admin client → Deploy
  3. 填寫部署表單:
欄位值說明
IDurn:HelloWorld_SOAPServiceService 唯一識別碼,Client 端呼叫時使用
ScopeApplication生命週期:Request/Session/Application
MethodssayHi公開方法列表,逗號分隔
Provider TypejavaJava 類別提供者
Java Provider - Provider ClassHelloWorld.SOAPService完整類別名稱
Java Provider - Static?No非靜態方法,每次請求新建實例
  1. 點擊 Deploy → 再點 List 確認部署成功

步驟 3:撰寫 Client 端呼叫程式


// HelloWorldClient.java
import java.net.URL;
import java.util.Vector;
import org.apache.soap.*;
import org.apache.soap.rpc.*;

public class HelloWorldClient {
    public static void main(String[] args) throws Exception {
        String endpoint = "https://localhost:8080/soap/servlet/rpcrouter";
        String serviceURN = "urn:HelloWorld_SOAPService";
        String methodName = "sayHi";
        String paramName = "ourName";
        String paramValue = "Superman";
        
        Call call = new Call();
        call.setTargetObjectURI(serviceURN);
        call.setMethodName(methodName);
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); // SOAP 編碼風格
        
        Vector params = new Vector();
        params.addElement(new Parameter(paramName, String.class, paramValue, null));
        call.setParams(params);
        
        System.out.print("呼叫 " + serviceURN + "." + methodName + "(" + paramValue + ") → ");
        Response response = call.invoke(new URL(endpoint), "");
        
        if (response.generatedFault()) {
            Fault fault = response.getFault();
            System.out.println("失敗! Code=" + fault.getFaultCode() + ", Msg=" + fault.getFaultString());
        } else {
            Parameter result = response.getReturnValue();
            System.out.println("成功: " + result.getValue());
        }
    }
}

步驟 4:編譯執行 Client


javac HelloWorldClient.java
java HelloWorldClient

輸出結果


呼叫 urn:HelloWorld_SOAPService.sayHi(Superman) → 成功: Hello my friend, Superman! Glad to see you!
Client 執行畫面

實際 SOAP 訊息交換內容

Request Envelope (Client → Router)




    
        
            Superman
        
    

Response Envelope (Router → Client)




    
        
            Hello my friend, Superman! Glad to see you!
        
    

進階主題與現代演進

WSDL:服務描述語言

SOAP 本身不描述服務介面。WSDL (Web Services Description Language) 定義服務端點、操作、訊息格式、綁定協議。工具可從 WSDL 自動生成 Client Stub / Server Skeleton。

從 Apache SOAP 到 Axis / JAX-WS

  • Apache Axis (1.x/2.x):SOAP 後繼者,支援 WSDL2Java、Java2WSDL、WS-Security
  • JAX-WS (Java API for XML Web Services):Java EE 標準,註解驅動 (@WebService, @WebMethod),內建於 JDK 6+,支援 MTOM、WS-* 標準
  • Spring Web Services:Contract-First 開發,整合 Spring 生態

REST/JSON 的崛起

現代微服務傾向 REST + JSON:語義清晰 (HTTP 動詞)、輕量、瀏覽器原生支援、易於快取。但 SOAP 在企業級強契約、WS-Security、分散式交易 (WS-AtomicTransaction)、非 HTTP 傳輸等場景仍具不可替代性。

常見坑與除錯技巧

問題原因解決
ClassNotFoundException: SOAPServiceCLASSPATH 未包含 Service 類別目錄確認 Tomcat 啟動 CLASSPATH 或放入 WEB-INF/classes
Fault: "Service not found"URN 不匹配或未部署Admin Tool List 確認 ID 拼寫
連線逾時/拒絕Tomcat 未啟動或端口錯誤驗證 https://localhost:8080/soap/ 可訪問
中文亂碼編碼不一致確保 Client/Server/XML 皆用 UTF-8,JVM 參數 -Dfile.encoding=UTF-8

總結

SOAP 以 XML + HTTP 實現了跨平台、穿透防火牆的遠端呼叫標準。雖然現代趨勢轉向 REST,但理解 SOAP 的 Envelope 結構、RPC 路由機制、WSDL 契約、安全擴展,對維護既有企業系統、對接金融/電信/政府等強契約介面仍具關鍵價值。本文從環境建置到 HelloWorld 完整落地,提供可直接執行的實戰範本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved