【问题标题】:What is the difference between error and fault in Spring-WS SOAP calls?Spring-WS SOAP 调用中的错误和错误有什么区别?
【发布时间】:2021-01-12 14:40:07
【问题描述】:

我正在尝试通过 Spring Boot 应用程序进行 SOAP 调用。调用返回状态码 400 和没有内容的 SOAP 信封。当响应由 WebServiceTemplate 处理时,它被描述为错误而不是错误,并且我试图访问的 SOAP Web 服务似乎根本无法识别该请求。响应如下所示:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body/>
</SOAP-ENV:Envelope>

我已经调试了请求,并在 postman / insomnia 中重新创建了它。从任一请求工具发布时,它似乎工作正常。即使我为 HTTP 标头或 xml 正文发送垃圾值,我也会收到如下响应以及代码 400:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Client</faultcode>
      <faultstring>RequestDataInvalid Request data is invalid.</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

即使请求包含非法值,我尝试访问的网络服务似乎至少可以识别该请求。

错误和故障有什么区别?解决问题的一大步是知道为什么我的无效请求被认为是错误而不是错误。这可能与连接/网络问题有关吗?查看 SOAP Web 服务 URL 时,该服务似乎与 Microsoft Dynamics Business Central 有某种关系。

基本网址: https://api.businesscentral.dynamics.com

【问题讨论】:

    标签: soap spring-ws


    【解决方案1】:

    我从未使用过WebServiceTemplate,但它可能与响应的状态代码有关。 SOAP specification 表示应该在状态码 500 上接收 SOAP 错误:

    如果在处理请求时出现 SOAP 错误,SOAP HTTP 服务器必须发出 HTTP 500“内部服务器错误”响应,并在响应中包含 SOAP 消息,其中包含 SOAP Fault 元素(参见第 4.4 节),指示 SOAP处理错误。

    您正在获得状态码 400。

    快速阅读WebServiceTemplate javadoc 说明了它的setCheckConnectionForFault 方法:

    指示是否应检查连接是否有故障指示符(true),或者我们是否应仅依赖消息(false)。默认为真。

    使用 HTTP 传输时,此属性定义是否检查 HTTP 响应状态代码以获取故障指示器。 SOAP 规范和 WS-I Basic Profile 都定义了如果响应信封是故障,Web 服务必须返回“500 Internal Server Error”HTTP 状态代码。将此属性设置为 false 允许此模板处理不合格的服务。

    看起来您正在处理 non compliant WS-I Basic Profile Web 服务,但 WebServiceTemplate 仍在尝试处理故障,即使没有收到 500 状态代码,这似乎表明错误根据 SOAP 和 WS-I 规范,这不是一个适当的错误,只是被认为是一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 2013-06-20
      • 2016-07-23
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多