WSDL 教程(2025 版,通俗易懂完整指南)
WSDL(Web Services Description Language,Web 服务描述语言)是 XML 格式的文件,用来描述一个 SOAP Web Service 提供了哪些操作(operation)、输入输出消息格式、绑定协议(通常是 SOAP)、服务地址等。简单来说:WSDL 就是 Web Service 的“说明书”。
虽然现在 REST/GraphQL 更流行,但很多银行、电信、政府、企业内部系统仍然大量使用 SOAP + WSDL(尤其是中国),所以学会读写 WSDL 仍然非常有价值。
1. WSDL 2.0 基本结构(最常用的是 WSDL 1.1,但 2.0 更简洁)
一个典型的 WSDL 文件包含以下 7 大核心部分:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://example.com/weather/"
targetNamespace="http://example.com/weather/"
name="WeatherService">
<!-- 1. 类型定义(types)-->
<types>
<xs:schema targetNamespace="http://example.com/weather/">
<xs:element name="GetTemperatureRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="city" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetTemperatureResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="temperature" type="xs:int"/>
<xs:element name="unit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>
<!-- 2. 消息(message)-->
<message name="GetTemperatureInput">
<part name="parameters" element="tns:GetTemperatureRequest"/>
</message>
<message name="GetTemperatureOutput">
<part name="parameters" element="tns:GetTemperatureResponse"/>
</message>
<!-- 3. 端口类型(portType)= 接口 -->
<portType name="WeatherPortType">
<operation name="GetTemperature">
<input message="tns:GetTemperatureInput"/>
<output message="tns:GetTemperatureOutput"/>
</operation>
</portType>
<!-- 4. 绑定(binding)= 具体怎么传(SOAP 1.1 / SOAP 1.2 / HTTP GET/POST)-->
<binding name="WeatherSoapBinding" type="tns:WeatherPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetTemperature">
<soap:operation soapAction="http://example.com/weather/GetTemperature"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<!-- 5. 服务(service)-->
<service name="WeatherService">
<port name="WeatherPort" binding="tns:WeatherSoapBinding">
<soap:address location="http://example.com/weather/service"/>
</port>
</service>
</definitions>
2. 每个部分到底是干什么的?
| 部分 | 作用 | 类比 Java/.NET |
|---|---|---|
| types | 定义请求和响应的 XML 结构(用 XSD) | 参数类、返回类(DTO) |
| message | 把 types 里的元素包装成“消息” | 方法的一个输入或输出参数 |
| portType | 定义抽象接口(有哪些操作) | Java Interface 或 C# interface |
| binding | 具体用什么协议传(SOAP 1.1、1.2、HTTP) | 实现接口的具体方式 |
| service | 告诉你在哪台服务器、哪个 URL 上能访问 | 部署后的服务地址 |
3. 两种常见的 style/use 组合(最容易踩坑的地方)
| style | use | 说明 | 生成代码是否好看 |
|---|---|---|---|
| document | literal | 推荐!XML 直接按 schema 走,不包一层 | 非常干净(主流) |
| rpc | encoded | 老古董,几乎没人用了,参数会变成 123 | 难看,已淘汰 |
| document | encoded | 不合法组合 | – |
| rpc | literal | 偶尔见到 | 一般 |
2025 年 99% 的新项目都用 document/literal wrapped。
4. 快速上手实战(3 分钟生成客户端)
工具推荐(任选其一):
- SoapUI(最简单)
File → New SOAP Project → 把 WSDL URL 贴进去 → 自动生成所有请求模板 - Java 21+(内置 jakarta.xml.ws 已移除,用 Apache CXF 或 Spring Boot)
# 用 Apache CXF(推荐)
wsdl2java -p com.example.weather -autoNameResolution http://example.com/weather?wsdl
- .NET 8
dotnet svcutil http://example.com/weather?wsdl
- Python
pip install zeep
from zeep import Client
client = Client('http://example.com/weather?wsdl')
result = client.service.GetTemperature(city="Beijing")
print(result)
5. 常见 WSDL 地址示例(可以直接拿来练习)
- 全球天气(已停用很多,但还有存活的):
http://www.webservicex.net/globalweather.asmx?WSDL - 中国手机号归属地(持续多年可用):
https://cx.shouji.360.cn/phonearea.php?wsdl - 身份证查询(测试用):
http://www.webxml.com.cn/WebServices/IdCardWS/idcard.asmx?wsdl
6. 小结:读懂 WSDL 的 4 步法
- 打开 WSDL,先找
<service name="XXX">看服务叫什么名字 - 找
<port>里面的<soap:address location="...">→ 这就是你要调的 URL - 找
<binding>和<portType>看支持哪些 operation(方法) - 找
<types>里的<xs:element name="xxxRequest">和xxxResponse看请求响应结构
只要掌握这 4 步,任何 WSDL 你都能秒懂!
需要我给你一个完整的可运行 Spring Boot + Apache CXF 示例,或者 .NET 8 示例,或者 Postman/SoupUI 导入技巧,直接告诉我!