API-Connect 2018 年未将来自 Wiremock 的 SOAP 错误响应检测为 SOAPFault

SOAP Fault response from Wiremock not detected as SOAPFault by API-Connect 2018

当我使用无效参数值调用实际的 SOAP 服务(使用 Postman 和 SoapUI)时,它会导致 SOAP-Fault 响应 HTTP 200 。

我将响应的body复制到Wiremock响应文件中,其对应的映射文件returns HTTP 200.

当我使用 Postman 调用 SOAP 服务和模拟服务时,响应的 'Body' 是相同的(除了 headers,因为模拟响应没有明确设置任何内容) .

当我的 API 调用实际的 SOAP 服务时,SOAPError 被捕获,处理停止并且 API 按照 'catch' 部分中的定义进行处理。

但是,当 API 调用模拟 SOAP 服务时,在 'invoke' 之后未检测到 SOAPError,处理继续并产生不正确的响应。

这表明 'extra' 从真正的 SOAP 服务的故障中返回了一些东西,APIC 用来检测 SOAPError。这是什么?

如果我知道它应该是什么,我会把它添加到模拟响应中。

顺便说一句:对于有效参数和无效参数的 SOAP 错误,响应 headers 是相同的。

[编辑] 谢谢@Jan Papenbrock。添加 "Content-Type = text/xml" 解决了这个问题。 我不知道为什么我认为我从真实和模拟的回复中收到了相同的 headers - 完全是垃圾! 约翰 [/编辑]

与 WireMock 有同样的错误,并在 this question 的答案的帮助下修复了它。就我而言,Content-Type header 丢失了。

我建议您尝试以下操作:

  1. 发送 Content-Type: text/xml 作为响应 header(或尝试 application/soap+xml
  2. Return SOAP 错误响应的 HTTP 状态代码 500,根据 specification(注意:状态 400 对我不起作用)。

我的存根生成是这样的:

static ResponseDefinitionBuilder errorInvalidStopResponse() {
    responseWithBodyFile('response-error-invalid-stop.xml')
            .withStatus(500)
}

static ResponseDefinitionBuilder responseWithBodyFile(String responseBodyFileName)   {
    aResponse()
            .withStatus(200)
            .withHeader("Content-Type", "text/xml")
            .withBodyFile(responseBodyFileName)
}