WSDL即Web服务描述语言,是描述Web服务接口和调用规范的标准化XML格式文档,其中types、message、portType是构建服务定义的核心元素,三者分工不同但相互关联,共同完成服务接口的完整描述。

types元素的作用
types元素用于定义Web服务中使用的所有数据类型,这些类型可以是简单类型,也可以是复杂的结构化类型。WSDL中通常使用XML Schema来定义数据类型,保证不同平台之间的数据格式兼容性。
比如我们要定义一个用户信息的复杂类型,包含用户ID和用户名两个字段,对应的types定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlso.com/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xsd:schema targetNamespace="http://ippipp.com/user">
<xsd:complexType name="UserInfo">
<xsd:sequence>
<xsd:element name="userId" type="xsd:int"/>
<xsd:element name="userName" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
</wsdl:definitions>
message元素的作用
message元素用于定义Web服务交互过程中传递的消息,每个消息对应一次请求或者响应的数据内容,消息的组成可以是定义在types中的数据类型,也可以是简单的内置类型。
通常一个操作会对应两个message,分别是输入消息和输出消息,上面的用户信息类型对应的消息定义如下:
<wsdl:message name="getUserRequest">
<wsdl:part name="userId" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="getUserResponse">
<wsdl:part name="userInfo" type="tns:UserInfo"/>
</wsdl:message>
这里tns:UserInfo就是之前在types中定义的复杂类型,tns是对应命名空间的前缀。
portType元素的作用
portType元素用于定义Web服务支持的操作集合,相当于服务提供的功能接口,每个操作会关联对应的输入消息和输出消息,明确操作的请求参数和返回结果。
结合前面的消息定义,portType的定义示例如下:
<wsdl:portType name="UserPortType">
<wsdl:operation name="getUser">
<wsdl:input message="tns:getUserRequest"/>
<wsdl:output message="tns:getUserResponse"/>
</wsdl:operation>
</wsdl:portType>
三者的关联关系
这三个元素的关系可以总结为:types定义数据类型,message使用types定义的类型来封装请求和响应的消息内容,portType则通过关联message来定义服务支持的操作,明确每个操作的输入输出格式。
三者的依赖顺序为:先定义types中的数据类型,再基于这些类型定义message消息,最后在portType中引用message来定义操作,这样的结构保证了WSDL文档的逻辑清晰和可扩展性。
实际使用示例
下面是一个完整的简单WSDL片段,展示三个元素的配合使用:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xml.com/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://ipipp.com/user"
targetNamespace="http://ipipp.com/user">
<!-- 定义数据类型 -->
<wsdl:types>
<xsd:schema targetNamespace="http://ipipp.com/user">
<xsd:complexType name="UserInfo">
<xsd:sequence>
<xsd:element name="userId" type="xsd:int"/>
<xsd:element name="userName" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<!-- 定义消息 -->
<wsdl:message name="getUserRequest">
<wsdl:part name="userId" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="getUserResponse">
<wsdl:part name="userInfo" type="tns:UserInfo"/>
</wsdl:message>
<!-- 定义操作接口 -->
<wsdl:portType name="UserPortType">
<wsdl:operation name="getUser">
<wsdl:input message="tns:getUserRequest"/>
<wsdl:output message="tns:getUserResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
通过这个示例可以清晰看到,三个元素各司其职,共同完成了getUser操作的接口定义,客户端可以根据这个WSDL文档生成对应的调用代码,服务端也可以按照这个定义实现服务逻辑。