Bij het bouwen van SOAP of HTTP diensten met de WSO2 Enterprise Integrator of WSO2 Enterprise Service Bus is het soms nodig om bepaalde headers bij een bericht dat verzonden wordt te verwijderen of eraan toe te voegen. Om dit makkelijk te maken heeft het WSO2-product de <header> mediator om je te helpen bij deze taak. In deze blog vertellen we alle ins en outs over het gebruik van deze mediator.
Voor alle voorbeelden in dit blog gebruik ik het volgende inputbericht:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <headerData>Thisismyheaderdata</headerData> </soapenv:Body> </soapenv:Envelope>
Http headers
HTTP headers zijn relatief eenvoudig te produceren met de Header mediator. Hierbij kun je de naam kiezen door de “name” property van de mediator in te stellen.
Daarnaast kan er in de “value” property de waarde van de header toegevoegd worden en in het geval van HTTP headers moet de “scope” altijd op “transport” staan.
Bij een “Accept” header zie het er vervolgens zo uit:
<header name="Accept" value="text/xml" scope="transport"/>
SOAP headers
SOAP headers hebben wat meer variatie in mogelijkheden, dus wordt niet alles door de header mediator aangeboden.
Als eerste bespreken we wat er wél mogelijk is met de Header mediator.
Het toevoegen van een eenvoudige SOAP-header kan door een configuratie zoals de onderstaande te gebruiken voor de Header mediator:
onderstaande te gebruiken voor de Header mediator: <header scope="default"> <myHeaderName xmlns="https://www.yenlo.com"> Iwanttosendthisheader </myHeaderName> </header>
Het resultaat ziet er zo uit:
<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <myHeaderName xmlns="https://www.yenlo.com"> Iwanttosendthisheader </myHeaderName> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>
Zoals hierboven te zien is, zal dit resulteren in een gehardcode header. Als we echter op zoek zijn naar iets dynamischer dan kun je de beide xpath functies (regular en synapse) gebruiken die door de ESB aangeboden worden.
Bijvoorbeeld:
- Data uitlezen van het binnenkomende berichtelement “headerData”
<header xmlns:y="https://www.yenlo.com" expression="//headerData" name="y:header" scope="default"/>
2. Het gebruik van de Synapse xpath functie om gegevens op te halen uit een property met de naam “headerData”
<header xmlns:y="https://www.yenlo.com" expression="$ctx:headerData" name="y:header" scope="default"/>
3. Of een combinatie van beide waar we specifiek de “headerData” uit de body van het bericht halen
<header xmlns:y="https://www.yenlo.com" expression="$body/headerData" name="y:header" scope="default"/>
Dit mond allemaal uit in het volgende bericht (de headerData staat ook in de body omdat we het oorspronkelijke binnenkomende bericht niet gewijzigd hebben):
<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <y:header xmlns:y="https://www.yenlo.com"> Thisismyheaderdata </y:header> </soapenv:Header> <soapenv:Body> <headerData>Thisismyheaderdata</headerData> </soapenv:Body> </soapenv:Envelope>
Meer informatie over de synapse xpath functie is hier te vinden.
Behalve de extra dynamiek door gegevens toe te voegen is het indien nodig ook mogelijk om complexere XML-constructies in de header te gebruiken.
<header> <m:complexHeader xmlns:m="https://www.yenlo.com"> <subPartOne expression="Some expression"/> <subPartTwo value="Some value"/> </m:complexHeader> </header>
Ik merkte eerder al op dat er dingen zijn die de Header mediator niet ondersteund. Dit is het geval wanneer er dynamische headers noodzakelijk zijn binnen een complexe XML-structuur. Hieronder staat een voorbeeld waarin de header UsernameToken
gevuld moet worden om veiligheidsredenen. Hoewel dit niet lukt met de Header mediator, kan dit alsnog gedaan worden met de Script mediator.
In de Script mediator wordt een <![CDATA[some stuff]]>
blok gebruikt, omdat we XML-elementen zullen moeten aanmaken. Het CDATA blok heeft de functie om te verzekeren dat ze niet als XML geïnterpreteerd worden, zodat het script uitgevoerd kan worden.
De Script mediator haalt nu eerst de gebruikersnaam en het wachtwoord op vanuit de bepaalde properties. In dit geval wordt het wachtwoord opgehaald uit de secure vault binnen de ESB. Voor meer informatie over de secure vault kan ik je deze blog van mijn collega Jan Timmerman aanraden.
<property value="myUserName" name="BackendUser" scope="default" type="STRING"/> <property expression="wso2:vault-lookup(SomePasswordKey)" name="BackendPassword" scope="default" type="STRING"/> <script language="js"> <![CDATA[var password = mc.getProperty("BackendPassword"); var username = mc.getProperty("BackendUser"); mc.addHeader(false, <Security xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext"> <UsernameToken xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext"> <Username xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext"> {username} </Username> <Password xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext"> {password} </Password> </UsernameToken> </Security>);]]> </script>
Het uiteindelijke bericht ziet er als volgt uit:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <Security soapenv:mustUnderstand="0" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext"> <UsernameToken> <Username>BackendUserPropertyData</Username> <Password>BackendPasswordPropertyData</Password> </UsernameToken> </Security> </soapenv:Header> <soapenv:Body> <headerData>Thisismyheaderdata</headerData> </soapenv:Body> </soapenv:Envelope>
Hiermee sluiten we dit voorbeeld over de functies van de header mediator af. Ik hoop dat deze post je helpt bij jouw ESB/EI-projecten! Voor opmerkingen of vragen, schroom niet hieronder een commentaar achter te laten.
Gepubliceerd op 4 oktober, 2018