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

WebService 實戰:JAX-WS 快速發布與調用,從 WSDL 到客戶端代碼生成

     編輯:Java 綜合教學

前言:WebService 其實就是跨語言的 RPC

許多初學者聽到「介面」或「WebService」就感到困惑。實際上,WebService 就是基於 HTTP 協議的遠程過程調用(RPC),它讓不同語言、不同平台的系統透過 XML(SOAP)交換資料。本文將手把手教你使用 JDK 內建的 JAX-WS 發布服務、解析 WSDL、生成客戶端代碼,並用 TCP Monitor 抓包分析 SOAP 通訊細節。

核心概念速覽

術語說明
JAX-WSJava API for XML Web Services,JDK 1.6+ 內建標準
WSDLWeb Services Description Language,服務的「說明書」(XML 格式)
SOAPSimple Object Access Protocol,基於 XML 的訊息封裝協議
wsimportJDK 內建工具,根據 WSDL 生成客戶端調用代碼

三步發布一個 WebService

1. 定義服務實現類(加 @WebService)

@WebService
public class HelloService {
    public String sayHello(String name) {
        System.out.println("sayHello() called");
        return "Hello " + name;
    }
    public String sayHello2(String name) {
        return "Hello " + name;
    }

    public static void main(String[] args) {
        // 發布到 https://127.0.0.1:6789/hello
        Endpoint.publish("https://127.0.0.1:6789/hello", new HelloService());
        System.out.println("Server ready...");
    }
}

關鍵點:

  • 類上 @WebService 會將所有非 static、非 final 的 public 方法暴露
  • 用 @WebMethod(exclude=true) 可隱藏特定方法
  • Endpoint.publish() 內部啟動一個 ServerSocket 監聽請求

2. 獲取 WSDL「說明書」

瀏覽器訪問:https://127.0.0.1:6789/hello?wsdl

WSDL 關鍵結構解讀(自下而上閱讀):

  • <service> → 服務名稱,對應客戶端 HelloServiceService 類
  • <port> → 端點,name 對應 getHelloServicePort()
  • <binding> → 綁定協議(SOAP over HTTP)
  • <portType> → 介面定義,<operation> 即方法
  • <message> → 輸入/輸出參數結構
  • <types> → XML Schema 定義資料類型

3. 生成客戶端代碼並調用

# 在命令列執行
wsimport -s . -p com.intsmaze.client https://127.0.0.1:6789/hello?wsdl
  • -s .:源碼生成到當前目錄(注意 -s 後有空格再接點)
  • -p:指定包名
  • 會同時生成 .java 和 .class,可直接複製到專案使用

客戶端調用代碼

public class App {
    public static void main(String[] args) {
        // 1. 建立 Service 對應 wsdl:service
        HelloServiceService service = new HelloServiceService();
        // 2. 獲取 Port 對應 wsdl:port
        HelloService port = service.getHelloServicePort();
        // 3. 像呼叫本地方法一樣調用
        String result = port.sayHello("intsmaze");
        System.out.println(result); // 輸出:Hello intsmaze
    }
}

內部實際發送 SOAP 請求,接收 SOAP 響應,完全屏蔽了網路通訊細節。

抓包分析:看見真實的 SOAP 通訊

使用 TCP/IP Monitor(Eclipse 內建)或 Wireshark 攔截:

  • 請求:HTTP POST + SOAP Envelope(含方法名、參數)
  • 響應:HTTP 200 + SOAP Envelope(含返回值)

HTTP 請求封包 HTTP 響應封包

進階提示

  • 複雜類型需加 @XmlSeeAlso 或 @XmlType 控制序列化
  • 大數據傳輸建議啟用 MTOM(Message Transmission Optimization Mechanism)
  • 生產環境通常搭配 CXF、Axis2 等框架,提供攔截器、安全、事務等企業級特性

總結

JAX-WS 讓 WebService 發布與調用變得極其簡單:註解標記 → Endpoint 發布 → wsimport 生成代碼 → 像本地調用一樣使用。理解 WSDL 結構與 SOAP 封包格式,有助於排查跨語言調用時的序列化、協議不匹配等問題。

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