SOAP Fault 元素详解
当 SOAP 服务端无法正常处理请求时,必须通过 <soap:Fault>(SOAP 1.1)或 <soap12:Fault>(SOAP 1.2) 元素返回错误信息。这个 Fault 元素只能出现在 Body 中,且 Body 中一旦出现 Fault,就不能再出现正常的业务响应数据。
1. SOAP 1.1 Fault 结构(最常见)
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode> <!-- 必选 -->
<faultstring>消息格式错误</faultstring> <!-- 必选,人可读的错误描述 -->
<faultactor>http://example.com/service</faultactor> <!-- 可选,哪个节点出错 -->
<detail> <!-- 可选,应用自定义错误信息 -->
<app:ErrorInfo xmlns:app="http://example.com/errors">
<app:Code>1001</app:Code>
<app:Message>参数 StockName 不能为空</app:Message>
</app:ErrorInfo>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
SOAP 1.1 标准 Fault 子元素:
| 子元素 | 是否必须 | 说明 |
|---|---|---|
| faultcode | 必须 | 标准错误码(带 soap: 前缀),常见值见下表 |
| faultstring | 必须 | 人可读的错误描述(可以是任意语言) |
| faultactor | 可选 | 出错的 SOAP 节点 URI(中间件或最终服务端),只有在有中介节点时才必须 |
| detail | 可选 | 应用层自定义错误细节,如果是 Body 解析错误,则不能有 detail |
SOAP 1.1 标准 faultcode(必须带 soap: 前缀):
| 错误码 | 含义 |
|---|---|
| soap:VersionMismatch | Envelope 命名空间不对(比如用了 1.2 的发给 1.1 服务) |
| soap:MustUnderstand | Header 中有 mustUnderstand=”1″ 但客户端没处理 |
| soap:Client | 客户端发送的消息有问题(格式、参数、认证等) |
| soap:Server | 服务器内部错误(数据库挂了、异常等) |
注意:实际开发中很多系统会把业务错误也用 soap:Client 或 soap:Server 表示,具体看实现约定。
2. SOAP 1.2 Fault 结构(字段更丰富、更规范)
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<soap12:Fault>
<soap12:Code>
<soap12:Value>soap12:Sender</soap12:Value> <!-- 必选 -->
<soap12:Subcode> <!-- 可选 -->
<soap12:Value>app:InvalidParameter</soap12:Value>
</soap12:Subcode>
</soap12:Code>
<soap12:Reason>
<soap12:Text xml:lang="zh-CN">参数无效</soap12:Text> <!-- 必选,可多语言 -->
<soap12:Text xml:lang="en">Invalid parameter</soap12:Text>
</soap12:Reason>
<soap12:Node>http://example.com/service</soap12:Node> <!-- 可选 -->
<soap12:Role>ultimateReceiver</soap12:Role> <!-- 可选 -->
<soap12:Detail>
<app:Error xmlns:app="http://example.com/app">
<app:Code>4001</app:Code>
<app:Field>StockCode</app:Field>
</app:Error>
</soap12:Detail>
</soap12:Fault>
</soap12:Body>
</soap12:Envelope>
SOAP 1.2 主要变化:
| SOAP 1.1 | SOAP 1.2 等价或变化 |
|---|---|
| faultcode | → (Sender/Receiver/DataEncodingUnknown 等) |
| faultstring | → (支持多语言) |
| faultactor | → |
| (新增) | 表示出错节点扮演的角色 |
| (新增) | 支持 Subcode 子码,方便业务自定义错误分类 |
SOAP 1.2 标准 Code/Value 值:
| Value | 含义 |
|---|---|
| soap12:VersionMismatch | Envelope 命名空间错误 |
| soap12:MustUnderstand | 必须理解的 Header 未处理 |
| soap12:DataEncodingUnknown | 不支持的编码方式 |
| soap12:Sender | 相当于 1.1 的 Client |
| soap12:Receiver | 相当于 1.1 的 Server |
3. 实际开发中最常见的 Fault 示例(Java/.NET 等框架自动生成)
<!-- 客户端参数错误(最常见) -->
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Validation error</faultstring>
<detail>
<error>参数 age 必须为正整数</error>
</detail>
</soap:Fault>
<!-- 服务器异常 -->
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Internal Server Error</faultstring>
</soap:Fault>
4. 总结表格对比
| 项目 | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Fault 元素位置 | ||
| 错误码 | (点分层次) | + 可选 |
| 错误描述 | (单语言) | (支持多语言) |
| 出错节点 | + | |
| 自定义细节 | ||
| 常见框架支持 | 非常广泛(老系统) | 较新系统、WS-* 规范更常用 |
如果你正在对接某个具体的旧系统或银行/政府接口,通常都是 SOAP 1.1 Fault;如果是对接比较新的微服务或使用 JAX-WS、Spring WS、.NET Core,通常会看到 SOAP 1.2 Fault。
需要我帮你写某个具体业务的 Fault 示例(比如登录失败、余额不足等),直接告诉我业务场景就行!