微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring-WS SOAP 调用中的错误和故障有什么区别?

如何解决Spring-WS SOAP 调用中的错误和故障有什么区别?

我正在尝试通过 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

解决方法

我从未使用过 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 基本概要都定义了如果响应信封是错误的,Web 服务必须返回“500 内部服务器错误”HTTP 状态代码。将此属性设置为 false 允许此模板处理不符合要求的服务。

看起来您正在处理 non compliant WS-I Basic Profile 网络服务,但 WebServiceTemplate 仍在尝试处理故障,即使未收到带有 500 状态代码的故障,这似乎表明根据 SOAP 和 WS-I 规范不是正确错误的错误,仅被视为错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。