SOAP Envelope 元素详解
Envelope 是整个 SOAP 消息的根元素(root element),也是唯一强制存在的顶级元素。它把整个消息封装成一个合法的 XML 文档。
1. 基本语法(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> ... </soap:Header> <!-- 可选 -->
<soap:Body> ... </soap:Body> <!-- 必须 -->
</soap:Envelope>
2. Envelope 元素的所有合法属性
| 属性名称 | 是否必须 | 允许值 / 说明 | SOAP 1.1 | SOAP 1.2 |
|---|---|---|---|---|
| xmlns:soap | 必须 | 指定 SOAP 命名空间 SOAP 1.2: http://www.w3.org/2003/05/soap-envelopeSOAP 1.1: http://schemas.xmlsoap.org/soap/envelope/ | 是 | 是 |
| soap:encodingStyle | 可选 | 指明 Body 和 Header 中数据的序列化规则 常用值: http://www.w3.org/2003/05/soap-encoding(SOAP 1.2 不推荐全局使用,建议在具体元素上声明) | 是 | 是(不推荐全局) |
| xmlns:其他前缀 | 可选 | 为业务 payload 或 Header 中用到的其他命名空间声明前缀 | 是 | 是 |
| xml:base | 可选 | XML Base,用于解析相对 URI | 否 | 是 |
| soap:role (SOAP 1.2) | 极少用 | 早期提案,已被 role 属性替代(Header 块上使用) | 否 | 否(已废弃) |
3. SOAP 1.1 与 SOAP 1.2 Envelope 的区别
| 项目 | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| 命名空间 URI | http://schemas.xmlsoap.org/soap/envelope/ | http://www.w3.org/2003/05/soap-envelope |
| 元素名称 | <env:Envelope> 或 <soap:Envelope> | 必须是 <soap:Envelope>(前缀可以自定义) |
| encodingStyle | 经常在 Envelope 上全局声明 | 强烈不推荐在 Envelope 上声明,建议局部声明 |
| 必须子元素顺序 | Header(可选) → Body(必须) | 完全相同,但规范更严格 |
4. 实际最常见的两种写法
SOAP 1.2(推荐)
<soap12:Envelope
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
...
</soap12:Envelope>
SOAP 1.1(很多老系统仍在用)
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
...
</soap:Envelope>
5. Envelope 必须满足的规则(否则算无效消息)
- 必须是 XML 文档的根元素
- 必须声明 SOAP 命名空间
- 只能包含一个
<soap:Header>(最多一个)和一个<soap:Body> <soap:Header>必须出现在<soap:Body>之前(如果存在)- 不允许出现其他同级元素(除了 XML 声明和注释)
6. 最小合法 SOAP 消息示例
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<hello>world</hello>
</soap:Body>
</soap:Envelope>
这就是一个完全符合标准的 SOAP 消息,虽然没有实际业务含义,但语法 100% 正确。
总结:Envelope 是 SOAP 消息的“信封”,所有内容都必须包裹在里面,它决定了消息使用的是 SOAP 1.1 还是 1.2,也承载了全局的编码风格声明(虽然现在不推荐)。