Hatem Ahmed
Hatem Ahmed

Reputation: 27

Mule ESB Flow calling SOAP not working but worked from SOAP UI

Details : I have created on flow in MuleESB which is calling a web-service without any parameter just sending it username, password and token in a property and it is working fine.

But the second API I want to post some parameters while calling soap request but I don't know how to use it I tried to pass through set payload but no response.

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<http:request-config name="HTTP_Request_Configuration" host="webservicehostadd" port="443" doc:name="HTTP Request Configuration">
        <http:basic-authentication username="username" password="pass"/>
    </http:request-config>
    <ws:consumer-config name="Web_Service_Consumer" wsdlLocation="https://xxxx/1.0?wsdl" service="xxx" port="xxxx" serviceAddress="https://xxxxx/1.0" connectorConfig="HTTP_Request_Configuration" doc:name="Web Service Consumer"/>
    <flow name="mycustomflow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/TEST" doc:name="HTTP"/>
        <set-property propertyName="APIKey" value="xxx-xxx-xxx-xxx-xxx" doc:name="Property"/>
        <dw:transform-message doc:name="Transform Message" metadata:id="xxx-xxx-xxx-xxx-xxxxxxxx">
            <dw:input-payload mimeType="application/xml"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/xml
%namespace ns0 http://localhost/getDetails:getDetailsWSD
---
{
    ns0#getDetails: {
        getDetailsOrder: {
            ID: payload.ns0#getDetails.getDetailsOrder.ID,
            AllData: payload.ns0#getDetails.getDetailsOrder.AllData
        }
    }
}]]></dw:set-payload>
        </dw:transform-message>
        <ws:consumer config-ref="Web_Service_Consumer" operation="employeeDetails" doc:name="Web Service Consumer"/>
    </flow>

It showed the below error:

Exception while executing: 
[row,col]: [1,1]
Unexpected character '{' (code 123) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1].

Upvotes: 0

Views: 1011

Answers (1)

Angelo Sandaga
Angelo Sandaga

Reputation: 126

Updated answer:

<dw:transform-message metadata:id="XXXXX" doc:name="Transform Message">
<dw:set-payload><![CDATA[
    %output application/xml skipNullOn="everywhere" 
    %namespace ns0 localhost/getDetails:getDetailsWSD 
    ---
    {
       ns0#getDetails: { 
          getDetailsOrder: { 
             ID: payload.ns0#getDetails.getDetailsOrder.ID, 
             AllData: payload.ns0#getDetails.getDetailsOrder.AllData 
          } 
       } 
    }]]>
</dw:set-payload>
</dw:transform-message>

In your scenario: you are passing a body in XML format and sometimes an empty body in your Postman requests.

Passing an empty body results your payload to be {NullPayload}. To handle this, we have to remove explicitly defining the input mime type: <dw:input-payload mimeType="application/xml"/>.

In your transformation: ID: payload.ns0#getDetails.getDetailsOrder.ID,. You are retrieving a value from an empty payload and this will fail. To avoid failing, we have added: skipNullOn="everywhere". You can read more about it here.

I have tried the transformation myself which results to this:

<?xml version='1.0' encoding='UTF-8'?>
<ns0:getDetails xmlns:ns0="http://localhost/getDetails:getDetailsWSD">
    <getDetailsOrder/>
</ns0:getDetails>

I think we are done with your initial issue regarding transformation of your empty payload. Your concern now is consuming the web service.

Thank you.

Upvotes: 0

Related Questions