对接一个老系统的发货接口,对方丢过来一个 .wsdl 文件,说「接口全在里面」。打开一看满屏 XML,先是 definitions,然后 types、message、portType,一串名字看不出用途。这篇就把这份文档拆开讲,看到就能对上号。

WSDL 是什么

WSDL 是 Web Services Description Language 的缩写,本质是一份用 XML 写的接口说明书,描述一个 SOAP 服务有哪些方法、接收什么参数、返回什么结构,以及服务地址在哪里。它对应的是传统的 SOAP 体系,不是现在的 REST 接口。

一个 WSDL 文件通常包含下面几层,顺序固定:

types:数据结构定义

这一层用 XML Schema 定义入参和出参的复杂类型。比如查询订单返回的 Order 对象里有哪些字段、字段是什么类型、是否必填。

message:消息定义

把 types 里定义的结构组合成一条请求或响应。常见命名是 XxxRequest 和 XxxResponse,每个 message 由若干个 part 组成。

<message name="GetOrderRequest">
  <part name="orderNo" type="xsd:string"/>
</message>

portType:接口方法集合

相当于 Java 里的接口定义,列出每个操作(operation)的名称,以及对应的 input、output 和可能的 fault 消息。

binding:协议绑定

指定这个 portType 用什么协议通信,通常是 SOAP over HTTP,同时声明 style 是 rpc 还是 document,use 是 literal 还是 encoded。老系统里 encoded 很常见,新一点的都用 document/literal。

service:服务地址

最外层给出访问地址,形如 http://ip:port/xxx?wsdl。把浏览器地址后面加上 ?wsdl,通常就能拿到完整文档。

怎么读懂它、调通它

先用 SOAP UI 或 Postman 导入 WSDL,工具会自动生成请求模板,填上参数就能发,比手写 XML 省事得多。几个常见坑:一是命名空间必须与 WSDL 完全一致,少个斜杠都报错;二是 SOAPAction 头有的服务必须带,有的不允许带;三是有些服务返回 HTTP 200 但 body 里是 fault,需要解析 soap:Fault 而不是只看状态码。

什么时候该弃用

新项目不必再上 SOAP。WSDL 的优点是强类型、能自动生成客户端代码,缺点是报文臃肿、排错靠肉眼看 XML。真遇到必须对接的老接口,用工具生成代理类,把 XML 细节挡住即可。