SOAP 是什么
SOAP 是基于 XML 的消息协议,用 Envelope 与 Body 承载调用与响应,通常绑定在 HTTP(S) 上传输;服务契约由 WSDL 描述(端点地址、操作名、消息结构),数据类型由 XSD 定义,并内置 WS-Security、WS-Addressing 等扩展族。它在政务、金融、电信等企业集成场景有大量存量接口,新项目多改用 REST 或 gRPC。
基本信息
| 契约文件 | WSDL 描述端点、操作、消息与绑定;XSD 描述数据类型 |
|---|---|
| 消息结构 | Envelope 信封内含可选的 Header 与必选的 Body |
| 传输绑定 | 以 HTTP(S) 为主,规范也支持 SMTP、JMS 等绑定 |
| 扩展标准 | WS-Security 签名与加密、WS-Addressing、WS-ReliableMessaging |
| 工具链 | 主流语言多支持从 WSDL 生成客户端桩,手写报文不划算 |
对接前的核对项
| 核对项 | 说明 |
|---|---|
| 命名空间 | Body 内元素命名空间必须与 WSDL 一致,拼错会被直接拒绝 |
| 绑定风格 | document/literal 与 rpc/encoded 报文结构不同,应按 WSDL 生成桩 |
| 安全策略 | WS-Security 的版本、凭证类型与摘要算法需与对端逐项确认 |
| 字符集 | 声明 UTF-8 还是 GBK,中文与特殊符号最容易出问题 |
| 元素顺序 | XSD sequence 对子元素顺序有要求,顺序错会被判定为不合法 |
典型使用场景
- 对接只在 SOAP 上提供接口的政务、金融、电信存量系统
- 需要消息级签名与加密,而不是仅靠传输层 TLS 保护报文
- 企业内异构系统经 ESB 做协议转换与统一暴露
- 以 WSDL 作为正式契约,为多语言调用方生成客户端桩
SOAP 请求结构(简化)
SOAP 请求结构(简化)
# 请求:Envelope 包 Body,命名空间须与 WSDL 一致
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
<soap:Header/> # 放安全与寻址信息,可空
<soap:Body>
<GetOrder xmlns='urn:orders'> # 元素顺序按 XSD sequence
<OrderId>1001</OrderId>
</GetOrder>
</soap:Body>
</soap:Envelope>对接 SOAP 服务时先取 WSDL 用工具生成客户端桩,手写 XML 极易在命名空间、元素顺序与日期格式上出错,且报错信息往往只有一句校验失败。
WS-* 扩展是可选能力,WSDL 里声明了策略不代表对端真的启用;上线前用样例报文实测签名、加密与超时行为,不要按声明做安全假设。