SOAP Fault 元素

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:VersionMismatchEnvelope 命名空间不对(比如用了 1.2 的发给 1.1 服务)
soap:MustUnderstandHeader 中有 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.1SOAP 1.2 等价或变化
faultcode(Sender/Receiver/DataEncodingUnknown 等)
faultstring→ (支持多语言)
faultactor
(新增)表示出错节点扮演的角色
(新增)支持 Subcode 子码,方便业务自定义错误分类

SOAP 1.2 标准 Code/Value 值:

Value含义
soap12:VersionMismatchEnvelope 命名空间错误
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.1SOAP 1.2
Fault 元素位置
错误码(点分层次)+ 可选
错误描述(单语言)(支持多语言)
出错节点+
自定义细节
常见框架支持非常广泛(老系统)较新系统、WS-* 规范更常用

如果你正在对接某个具体的旧系统或银行/政府接口,通常都是 SOAP 1.1 Fault;如果是对接比较新的微服务或使用 JAX-WS、Spring WS、.NET Core,通常会看到 SOAP 1.2 Fault。

需要我帮你写某个具体业务的 Fault 示例(比如登录失败、余额不足等),直接告诉我业务场景就行!

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部