Search code examples
soapheadermulesoapuimule-el

Mule - Get SOAP operation with MEL


This is my mule flow:

HTTP Listener -> Logger -> WS:Consumer -> Logger

<flow name="ClientFlow" >
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
    <logger level="INFO" doc:name="Logger" message="#[message.payloadAs(java.lang.String)]"/>
    <ws:consumer config-ref="Web_Service_Consumer" doc:name="Web Service Consumer" operation="NewRequestTest"/>
    <logger message="#[message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/>

</flow>

I send a SOAP message to my mule flow with SOAPUI:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<NewRequestTest xmlns="urn:microsoft-dynamics-schemas/codeunit/Requests">
<xmlEntry>
<NewRequestTest>
<hiMessage>Hi</hiMessage>
<NewRequestTest>
</xmlEntry>
</NewRequestTest>
</soapenv:Body>
</soapenv:Envelope>

I want to do the operation from the ws:consumer dynamically getting from the SOAP header with a MEL expression.

In what way it would be possible to obtain that information?


Solution

  • You can just use the xpath3 function if your operation is specified somewhere in the body of the request, in this way:

    <set-variable variableName="operation" value="#[xpath('//theTagcontainingwhatyouwant')]" doc:name="Variable"/>
    <ws:consumer config-ref="Web_Service_Consumer" doc:name="Web Service Consumer" operation="#[flowVars['operation']]"/>
    

    Please note that in theory you could take the operation also from the SOAP-Action header that normally comes along with a soap request, you can access it via inboundProperties

    #[message.inboundProperties['SOAPAction']]
    

    Hope this helps