WSDL是描述Web服务的XML说明书,非接口本身;wsdl:portType定义抽象操作(能做什么),wsdl:binding定义协议实现细节(怎么做到);工具如wsimport、zeep依据binding生成客户端代码。

WSDL(Web Services Description Language)不是接口本身,而是一份用 XML 写的“接口说明书”——它不执行逻辑,只声明服务有哪些操作、每个操作要什么参数、返回什么结构、走什么协议、在哪访问。
wsdl:portType 和 wsdl:binding 的区别在哪
这是初学者最容易混淆的一对概念:wsdl:portType 描述「能做什么」(抽象接口),比如 getWeather 接收 cityName 字符串,返回 Temperature 类型;wsdl:binding 描述「怎么做到」(具体协议细节),比如这个操作走 SOAP 1.1、用 POST 方法、消息用文档/字面量(document/literal)风格序列化。
- 没定义
wsdl:binding,就只是个空想接口,没法调用 - 同一个
wsdl:portType可以有多个wsdl:binding(比如同时支持 SOAP 和 HTTP GET) - 实际生成客户端代码时,工具(如
wsimport或zeep)依赖的是wsdl:binding里的传输和编码规则
如何从 WSDL 自动生成调用代码(以 Java 和 Python 为例)
手动解析 WSDL 并拼 SOAP 请求是自找麻烦。主流做法是用工具生成强类型客户端类,把 XML 封装成本地对象。
- Java:用 JDK 自带的
wsimport工具
wsimport -keep -s src/main/java http://example.com/weather.wsdl
- Python:用
zeep(比suds更活跃、支持更多 WSDL 特性)
from zeep import Client client = Client('http://example.com/weather.wsdl') result = client.service.getWeather(cityName='Beijing') - 注意:如果 WSDL 引用了外部
xs:import或内联wsdl:types,确保网络可访问或提前下载并用-p指定本地路径
常见报错:「Invalid content was found starting with element 'xsd:import'」
这通常不是 WSDL 语法错误,而是解析器在加载 XSD 时失败了——比如引用的 xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" 实际并不存在,或 HTTPS 证书校验失败。
- 用浏览器或
curl直接请求 WSDL URL,确认能完整返回 XML - 检查所有
xsd:import和wsdl:import的location属性是否为绝对 URL,且可访问 - 某些老服务用
soapenc:Array等已废弃类型,现代工具(如 Zeep 4+)默认不支持,需显式启用兼容模式:settings = Settings(strict=False, xml_huge_tree=True) - WSDL 中的
targetNamespace和实际 SOAP 消息的xmlns不一致,也会导致解析失败,此时需检查服务端是否启用了命名空间别名映射
WSDL 的真正难点不在语法,而在它把协议、编码、传输、数据类型全耦合进一份文件里——一个字段类型改了,可能要同步更新 XSD、WSDL、客户端生成逻辑、甚至服务端反序列化配置。现在新项目基本绕开它,但对接遗留系统时,你得会看懂它哪一行在说“这里要用 base64 编码”,哪一行在悄悄禁用 SOAP Action 头。










