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

WebService 進階實戰(二):SOAP 協議深度剖析與 WSDL 定制化開發

     編輯:Java 相關知識

為什麼需要專用工具?

WebService 開發中,掌握請求/響應細節至關重要。三大神器各司其職:

  • WsExplorer:可視化發送 SOAP 請求、檢視 XML 結構,驗證服務可用性。
  • TCP/IP Monitor:作為代理攔截 HTTP 流量,捕獲完整請求/響應頭與 SOAP 體,排查通訊異常利器。
  • wsimport:根據 WSDL 生成客戶端存根代碼,實現類型安全調用。

SOAP 協議本質

SOAP(Simple Object Access Protocol)是基於 XML 的輕量級協議,運行於 HTTP 之上,實現跨語言、跨平台的遠程調用。核心結構:

<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header/>          <!-- 可選:安全、事務等元數據 -->
  <soap:Body>            <!-- 必選:實際業務負載 -->
    <ns:methodName>...</ns:methodName>
  </soap:Body>
</soap:Envelope>

實戰:驗證 QQ 在線狀態服務

1. 使用 WsExplorer 調用 qqCheckOnline

輸入 QQ 號 → 發送請求 → 獲得響應:

<soap:Envelope ...>
  <soap:Body>
    <qqCheckOnlineResponse xmlns="https://WebXml.com.cn/">
      <qqCheckOnlineResult>N</qqCheckOnlineResult> <!-- N=離線, Y=在線 -->
    </qqCheckOnlineResponse>
  </soap:Body>
</soap:Envelope>

2. TCP/IP Monitor 抓包配置步驟

  1. 開啟視圖:Window → Show View → Other → MyEclipse Common → TCP/IP Monitor
  2. 添加監聽配置:
    • Local monitoring port: 9876
    • Host name: 127.0.0.1(目標服務地址)
    • Port: 6666(目標服務端口)
    • Type: TCP/IP(保持原始路徑轉發)
  3. 啟動 Monitor,客戶端訪問 https://127.0.0.1:9876/helloworld?wsdl 即可捕獲完整交互。

WSDL 定制化:注解驅動契約優先開發

通過 JAX-WS 注解精確控制生成的 WSDL 結構,實現契約穩定與版本演進:

@WebService(
    name = "MyName",           // portType name
    portName = "MyPort",       // port name
    serviceName = "MyService", // service name
    targetNamespace = "https://leaf.com/mynamespace"
)
public class HelloWorld {
    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @WebMethod(action = "myAction", operationName = "myOperationName")
    @WebResult(name = "mySayHelloResult")
    public String sayHello() {
        return "HelloWorld";
    }

    @WebMethod(action = "mySayHiAction", operationName = "mySayHiOperationName")
    @WebResult(name = "mySayHiResult")
    public String sayHi(
        @WebParam(name = "myParamName", header = true, mode = Mode.IN) String name
    ) {
        return "你好:" + name + ",當前時間:" + SDF.format(new Date());
    }

    public static void main(String[] args) {
        Endpoint.publish("https://127.0.0.1:6666/helloworld", new HelloWorld());
    }
}

關鍵注解對照表

注解作用對應 WSDL 元素
@WebService定義服務端點portType, service, port
@WebMethod暴露為操作operation, soapAction
@WebParam自定義參數名、位置message part, header/body
@WebResult自定義返回值名output message part

客戶端調用生成與調用

// 1. 生成存根:wsimport -s . https://127.0.0.1:6666/helloworld?wsdl
// 2. 調用代碼
public class Client {
    public static void main(String[] args) {
        MyName port = new MyService().getMyPort(); // 對應 portName
        String result = port.mySayHiOperationName("王健"); // 對應 operationName
        System.err.println(result);
    }
}

版本兼容性提示

  • JDK 1.5 不支援 JAX-WS 註解。
  • JDK 1.6.0_20 以前需完整註解;_21 之後僅 @WebService 即可。
  • 修改註解會改變 WSDL 契約,導致舊客戶端調用失敗,需同步重新生成存根。

掌握 SOAP 結構、工具鏈與註解定制,即可構建健壯、可演進的企業級 WebService 服務。

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