SOAP消息由Envelope(必需)、Header(可选)、Body(必需)、Fault(可选)四个XML元素构成,其中Envelope须含标准命名空间且禁用DTD与处理指令,Header须为Envelope首子元素并支持mustUnderstand属性,Body须含业务载荷且不可混入Header语义内容。

SOAP协议是一种基于XML的通信协议,专为应用程序之间跨网络交换结构化信息而设计。它不依赖操作系统或编程语言,靠严格的XML语法和约定实现互操作性。理解它的关键,就是看懂SOAP消息的XML结构——它不是随意写的XML,而是有强制层级、命名空间和语义规则的标准化封装。
SOAP消息的四大核心XML元素
每条合法的SOAP消息都由四个可能存在的XML元素组成,其中两个是必需的,两个是可选的:
- Envelope(信封):根元素,唯一标识这是一条SOAP消息。没有它,就不是SOAP。
- Header(头部):可选,必须作为Envelope的第一个子元素。常用于携带认证令牌、事务ID、路由指令等元数据。
- Body(主体):必需,包含实际要调用的方法名、参数,或服务返回的结果数据。
- Fault(错误):可选,只能出现在Body内,且最多一个。当处理失败时,用它结构化地描述错误类型、代码和详情。
Envelope元素的硬性要求
Envelope不只是个标签,它承载着协议识别和解析依据:
- 命名空间必须准确:
SOAP 1.1用 http://schemas.xmlsoap.org/soap/envelope/;
SOAP 1.2用 http://www.w3.org/2003/05/soap-envelope。
错一个字符,接收方就会拒绝整条消息。 - encodingStyle属性是可选的,但一旦出现,就必须指向标准编码命名空间,如 http://www.w3.org/2001/12/soap-encoding。
- 不能包含DTD声明或XML处理指令(比如<?xml-stylesheet?>),否则直接视为非法。
Header与Body的实际写法要点
Header和Body本身不带业务逻辑,但它们的位置和内容组织影响通信成败:
- Header若存在,必须紧接在Envelope开始标签之后,顺序不能颠倒。
- Body必须存在,且至少包含一个子元素——通常是方法调用(如
<GetUser>)或响应(如<GetUserResponse>)。 - Header里的子元素可以带
mustUnderstand="1"属性,表示接收方必须理解并处理该字段,否则需返回Fault。 - Body中不允许混入Header语义的内容,所有上下文信息(如用户身份)应提前放入Header,保持Body专注业务载荷。
一个最小可用的SOAP请求示例
以下是一个符合SOAP 1.2规范、无Header、仅含简单调用的合法消息:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<GetStockPrice xmlns="http://example.org/stock">
<Symbol>IBM</Symbol>
</GetStockPrice>
</soap:Body>
</soap:Envelope>
注意:没有Header、没有Fault、命名空间正确、无DTD、无处理指令——它就能被标准SOAP引擎识别并转发。










