SOAP(Simple Object Access Protocol,简单对象访问协议)是一种基于 XML 的协议,用于在分布式系统中交换结构化信息,通常用于 Web Services。它最初由 Microsoft 在 1998 年提出,后来发展为 W3C 标准(最新正式版本是 SOAP 1.2,2003 年发布)。
SOAP 消息的完整语法结构是严格的 XML 文档,必须符合以下规范:
1. SOAP 消息基本结构(SOAP Envelope)
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" <!-- SOAP 1.2 -->
<!-- 或 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" SOAP 1.1 -->
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <!-- 可选 -->
<!-- 可选的 Header -->
<soap:Header>
<!-- Header blocks -->
</soap:Header>
<!-- 必须的 Body -->
<soap:Body>
<!-- 实际的业务数据或 Fault -->
</soap:Body>
</soap:Envelope>
2. 主要组成部分详解
| 部分 | 是否必须 | 说明 |
|---|---|---|
| Envelope | 必须 | 根元素,标识这是 SOAP 消息 |
| Header | 可选 | 存放元数据(如认证、安全、事务等) |
| Body | 必须 | 存放实际的调用信息或错误信息 |
| Fault | 在出错时 | 放在 Body 中,用于描述错误 |
3. 典型 SOAP 请求示例(SOAP 1.2)
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<!-- 示例:添加 WS-Security 认证头 -->
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>alice</wsse:Username>
<wsse:Password>secret123</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body>
<m:GetStockPrice xmlns:m="https://example.com/stock">
<m:StockName>ALIBABA</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
4. SOAP 响应示例
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetStockPriceResponse xmlns:m="https://example.com/stock">
<m:Price>128.50</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
5. SOAP Fault(错误)示例(SOAP 1.2)
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value> <!-- 或 Receiver -->
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Invalid stock name</soap:Text>
</soap:Reason>
<soap:Detail>
<m:Error xmlns:m="https://example.com/stock">
<m:Code>1001</m:Code>
<m:Message>Stock symbol not found</m:Message>
</m:Error>
</soap:Detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
6. SOAP 1.1 与 SOAP 1.2 的主要差异
| 项目 | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Envelope 命名空间 | http://schemas.xmlsoap.org/soap/envelope/ | http://www.w3.org/2003/05/soap-envelope |
| encodingStyle 属性 | 常用 | 仍支持,但不推荐使用 |
| Fault 结构 | 较简单(faultcode、faultstring 等) | 更规范(Code、Reason、Node、Role、Detail) |
| HTTP 绑定 | 简单 | 更严格,支持更多协议 |
7. 常用工具生成 SOAP 消息
- Java: Apache CXF, Axis2, JAX-WS
- .NET: WCF
- Python: zeep, pysimplesoap
- Node.js: soap, easy-soap
虽然现在 REST/JSON 更流行,但在银行、电信、政府等企业级系统里,SOAP 仍然被广泛使用(特别是配合 WS-Security、WS-Addressing 等标准时安全性更高)。
如果你有具体的 WSDL 或想生成某个接口的 SOAP 示例,可以把 WSDL 发给我,我可以帮你写出准确的请求/响应模板。