fb
WSO2 4 Minuten

WSO2 Header Mediator

Wouter van Wijngaarden
Wouter van Wijngaarden
Integration Consultant
Blog 13 1
Scrollen
Blog-13-1

Bei der Einrichtung von SOAP- oder HTTP-Diensten mit Hilfe des WSO2 Enterprise Integrators oder des WSO2 Enterprise Service Bus ist es manchmal notwendig, bestimmte Header einer zu übertragenden Nachricht entweder zu entfernen oder hinzuzufügen. Um dies zu erleichtern, verfügt das WSO2-Produkt über den <header> Mediator, der dich bei dieser Aufgabe unterstützt. In diesem Blog werde ich dir erklären, wie du diesen Mediator verwenden kannst.

Für jedes Beispiel in diesem Blog verwende ich die folgende Eingangsnachricht:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">   <soapenv:Header/>
   <soapenv:Body>
      <headerData>Thisismyheaderdata</headerData>
   </soapenv:Body>
</soapenv:Envelope>

Http Header

Http-Header sind mit dem Header-Mediator recht einfach zu erstellen, du kannst den Namen des Headers über die „name“-Eigenschaft des Mediators wählen.

Als „value“-Eigenschaft kann der Header-Wert hinzugefügt werden, und im Falle von HTTP-Headern sollte die „scope“-Eigenschaft „transport“ sein. 

Im Falle eines „Accept“-Headers würde das wie folgt aussehen:

<header name="Accept" value="text/xml" scope="transport"/>
Banner-WSO2-Community-1-3

SOAP Header

SOAP-Header haben etwas mehr Variationsmöglichkeiten, weshalb nicht alles durch den Header-Mediator abgedeckt wird.

Zuerst werden wir behandeln, was mit dem Header-Mediator möglich ist.

Einen einfachen SOAP-Header hinzuzufügen, kann mit etwas wie der folgenden Header-Mediator-Konfiguration erfolgen:

<header scope="default">
     <myHeaderName xmlns="https://www.yenlo.com">
          Iwanttosendthisheader
     </myHeaderName>
  </header>

Das ist das Resultat:

<?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>

Wie oben gezeigt, ergibt sich daraus natürlich ein hartkodierter Header, für etwas Dynamischeres kannst du beide (reguläre und Synapse-) xpath-Funktionalitäten des ESB nutzen.

Zum Beispiel:

1. Daten aus dem eingehenden Nachrichtenelement „headerData“ abrufen.

<header xmlns:y="https://www.yenlo.com"  expression="//headerData" name="y:header" scope="default"/>

2. Oder eine Kombination aus beidem, wobei wir speziell headerData aus dem Hauptteil der Nachricht abrufen.

<header xmlns:y="https://www.yenlo.com"  expression="$ctx:headerData" name="y:header" scope="default"/>

3. Or a combination of both where we specifically retrieve headerData from the body of the message.

<header xmlns:y="https://www.yenlo.com" expression="$body/headerData" name="y:header" scope="default"/> 

Sie endet in der folgenden Nachricht (die HeaderData befinden sich ebenfalls im Hauptteil, da wir die ursprünglich eingehende Nachricht nicht geändert haben):

<?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> 

Weitere Informationen über die Synapse-xpath-Funktionalität findest du hier.

Neben dem dynamischen Hinzufügen von Daten ist es auch möglich, bei Bedarf komplexere XML-Konstruktionen innerhalb des Headers hinzuzufügen.

<header>
    <m:complexHeader xmlns:m="https://www.yenlo.com">
        <subPartOne expression="Some expression"/>
        <subPartTwo value="Some value"/> 
   </m:complexHeader>
</header>

Wie ich schon erwähnt habe, gibt es Dinge, die der Header-Mediator nicht unterstützt. Dies ist dann der Fall, wenn ein Bedarf an dynamischen Headern innerhalb einer komplexen Xml-Struktur besteht. Nachstehend wird ein Beispiel gezeigt, bei dem ein Sicherheits-Header UsernameToken gefüllt werden muss; dies kann mit Hilfe des Skript-Mediators geschehen.

Innerhalb des Skript-Mediators wird ein <![CDATA[some stuff]]> Block verwendet, weil wir Xml-Elemente erstellen müssen. Der CDATA-Block funktioniert, um sicherzustellen, dass sie nicht als XML interpretiert werden, damit das Skript ausgeführt werden kann.

Um den Header hinzuzufügen, ruft der Skript-Mediator zuerst den Benutzernamen und das Passwort aus ihren spezifischen Eigenschaften ab. In diesem Fall wird das Passwort aus dem sicheren Tresor innerhalb des ESB abgerufen. Für weitere Informationen über den sicheren Tresor verweise ich dich auf den Blog, den mein Kollege Jan Timmerman geschrieben hat.

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

Die sich daraus ergebende Meldung sieht wie folgt aus:

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

Damit ist eine Präsentation der Funktionalitäten des Header Mediator abgeschlossen. Ich hoffe, dieser Beitrag hilft einigen Menschen bei ihren ESB/EI-Projekten! Für Anmerkungen oder Fragen zögere nicht, unten einen Kommentar zu schreiben.