soapibm-cloudwiremockapiconnectsoapfault

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


When I call the actual SOAP service (using Postman and SoapUI) with an invalid parameter value, it causes a SOAP-Fault response, with HTTP 200 .

I copied the body of the response into a Wiremock response file, whose corresponding mapping file returns HTTP 200.

When I use Postman to invoke the SOAP service and the mocked one, the 'Body' of the responses are identical (apart from headers, as the mocked response doesn't explicitly set any).

When my API invokes the actual SOAP service, the SOAPError is caught, the processing stops and the API is processed as defined in the 'catch' section.

However, when the API invokes the mocked SOAP service, the SOAPError is not detected after 'invoke', processing continues and produces an incorrect response.

This suggests that there is something 'extra' returned in a fault from a real SOAP service, that APIC uses to detect a SOAPError. What is it?

I would add it to the mocked response, if only I knew what it should be.

BTW: The response headers are the same for both valid parameters and the SOAP Fault for an invalid one.

[edit] Thanks @Jan Papenbrock. Adding "Content-Type = text/xml" sorted it out. I don't know why I thought I was receiving the same headers from real and mocked responses - total rubbish! John [/edit]


Solution

  • Had the same error with WireMock and fixed it with the help of answers to this question. In my case, the Content-Type header was missing.

    I suggest you try the following:

    1. Send Content-Type: text/xml as response header (or try application/soap+xml)
    2. Return HTTP status code 500 for the SOAP fault response, according to the specification (note: status 400 did not work for me).

    My stub generation looks like this:

    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)
    }