WSDL(Web Services Description Language)详解
WSDL 是 WebService 的核心描述语言,它以 XML 格式定义了一个 WebService 的功能、数据类型、通信协议、调用地址等关键信息,相当于 WebService 的 “说明书”。客户端通过解析 WSDL,就能知道如何调用服务(比如有哪些方法、参数格式、返回值类型、调用地址等),从而实现跨平台、跨语言的互操作。
WSDL 的核心作用
- 让客户端明确 WebService 提供的所有可调用功能(如方法名);
- 定义功能的输入参数、返回值的数据类型;
- 指定调用服务的协议(如 SOAP over HTTP)和数据格式;
- 提供服务的网络地址(如
http://localhost:8080/...
)。
WSDL 构成元素详解(结合示例代码)
WSDL 文档的所有内容都包裹在根元素<definitions>
中,其他元素按逻辑分层,形成 “抽象定义” 到 “具体实现” 的完整描述。以下结合你提供的示例代码,逐一解析各元素:
1. <definitions>
:根元素
作用:作为 WSDL 文档的容器,定义文档的命名空间(避免元素名冲突)和整体元数据。
示例解析:
1
2
3
4
5
6<wsdl:definitions
targetNamespace="http://com.study.demo/HelloService" <!-- 该WSDL的唯一命名空间 -->
xmlns:tns="http://com.study.demo/HelloService" <!-- 引用自身命名空间的前缀(tns即"this namespace") -->
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" <!-- SOAP相关命名空间 -->
... <!-- 其他标准命名空间(如XML Schema、SOAP编码等) -->
>命名空间是 WSDL 的核心,确保不同元素(如自定义类型和标准类型)不冲突。
2. <types>
:数据类型定义
作用:描述 WebService 与客户端之间交换的所有数据类型(如参数、返回值的格式),通常基于 XML Schema(XSD)定义。
示例解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<wsdl:types>
<xsd:schema ... targetNamespace="http://com.study.demo/HelloService"> <!-- 自定义类型的命名空间 -->
<!-- 定义"sayHello"方法的输入参数类型:包含一个string类型的"name"参数 -->
<xsd:element name="sayHello">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string" ... />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- 定义"sayHello"方法的返回值类型:包含一个string类型的"return"结果 -->
<xsd:element name="sayHelloResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="return" type="xsd:string" ... />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>这里定义了两个元素:
sayHello(输入参数)和sayHelloResponse(返回值),后续会被
<message>
元素引用。
3. <message>
:消息定义
作用:表示 WebService 与客户端之间传递的 “逻辑消息”(如请求消息、响应消息),由一个或多个
<part>
组成(每个<part>
对应一个参数或返回值)。示例解析:
1 | <!-- 定义"sayHello"方法的请求消息:引用types中定义的"sayHello"元素 --> |
每个<message>
通过element属性关联<types>
中定义的数据类型,明确消息的结构。
4. <portType>
:操作定义(服务接口)
作用:定义 WebService 支持的所有操作(即 “方法”),每个操作由 “输入消息”(客户端发送)和 “输出消息”(服务端返回)组成,相当于 “抽象接口”。
示例解析:
1
2
3
4
5
6<wsdl:portType name="HelloServicePortType"> <!-- 接口名 -->
<wsdl:operation name="sayHello"> <!-- 方法名:sayHello -->
<wsdl:input name="sayHelloRequest" message="tns:sayHelloRequest" /> <!-- 输入消息:请求参数 -->
<wsdl:output name="sayHelloResponse" message="tns:sayHelloResponse" /> <!-- 输出消息:返回值 -->
</wsdl:operation>
</wsdl:portType>这里定义了一个名为sayHello的操作,明确它需要sayHelloRequest作为输入,返回sayHelloResponse。
5. <binding>
:绑定协议与格式
作用:将
<portType>
定义的抽象操作 “绑定” 到具体的通信协议(如 SOAP over HTTP)和数据格式(如 SOAP 消息格式),是 “抽象接口” 到 “具体实现” 的桥梁。示例解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<wsdl:binding name="HelloServiceHttpBinding" type="tns:HelloServicePortType"> <!-- 绑定到HelloServicePortType接口 -->
<!-- 指定协议:SOAP over HTTP -->
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<!-- 为sayHello操作指定SOAP格式 -->
<wsdl:operation name="sayHello">
<wsdlsoap:operation soapAction="" /> <!-- SOAPAction:可选,用于标识操作 -->
<wsdl:input>
<wsdlsoap:body use="literal" /> <!-- 消息体使用“文字模式”(直接按XSD定义格式传输) -->
</wsdl:input>
<wsdl:output>
<wsdlsoap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>这里指定用 SOAP 协议(wsdlsoap:binding),且消息体按
<types>
中定义的字面格式(use=”literal”)传输。
6. <port>
:服务地址
作用:为
<binding>
绑定的具体协议指定网络地址(即服务的调用 URL)。示例解析:
1
2
3<wsdl:port name="HelloServiceHttpPort" binding="tns:HelloServiceHttpBinding"> <!-- 关联HelloServiceHttpBinding绑定 -->
<wsdlsoap:address location="http://localhost:8080/demo/services/HelloService" /> <!-- 服务地址 -->
</wsdl:port>
7. <service>
:服务集合
作用:聚集一个或多个
<port>
元素,代表一个完整的 WebService(一个服务可能有多个调用地址或协议)。示例解析:
1
2
3<wsdl:service name="HelloService"> <!-- 服务名 -->
<wsdl:port ... /> <!-- 包含一个或多个port(调用地址) -->
</wsdl:service>
WSDL 的层次关系
各元素按 “抽象→具体” 分层,关系如下:types
(数据类型)→ message
(消息)→ portType
(操作接口)→ binding
(绑定协议)→ port
(地址)→ service
(服务集合)
这种层次确保了 WebService 的 “松耦合”:抽象定义(如portType
)与具体实现(如协议、地址)分离,便于服务升级或更换协议。
WSDL 的实际用途
- 客户端通过解析 WSDL,可自动生成调用代码(如 Java 的
wsimport
工具),无需手动编写 SOAP 消息; - 开发者可通过 WSDL 快速了解服务的功能、参数和调用方式,降低集成难度;
- 支持跨平台 / 跨语言交互(如 Java 服务与 Python 客户端通过 WSDL 对接)