Legacy SOAP- & WSDL-basierte XML-Webdienste mit API-Gateways

Software hat vielleicht kein Verfallsdatum, aber ältere Systeme und Protokolle bleiben oft über viele Jahre im Einsatz. Das gilt besonders für XML-basierte Protokolle und Webdienste. Auch wenn diese Formate heutzutage meist nicht mehr bevorzugt werden, existieren sie weiterhin und müssen manchmal in moderne APIs integriert werden.

Dieser Text zeigt, wie man solche Legacy-Dienste in ein modernes API-Gateway integriert. Doch zuerst ein Blick auf die Gateways aus der SOA-Ära.

Frühe API-Gateways

Die erste Generation von API-Gateways basierte auf Tools aus der serviceorientierten Architektur (SOA) und bot hervorragende Unterstützung für Webdienste und XML. Allerdings benötigten diese Gateways oft Hunderte Gigabyte an Speicher und wurden schließlich durch schlankere, moderne Lösungen ersetzt.

Moderne API-Gateways

Moderne Gateways – oft in nginx, Go oder C++ implementiert – haben einen deutlich kleineren Ressourcenverbrauch. Sie bieten gute Unterstützung für JSON und YAML (häufig via Lua-Plugins), jedoch fehlt es meist an robuster XML- oder WSDL-Unterstützung. Dennoch können sie SOAP/WSDL-Nachrichten weiterleiten, solange diese über HTTP laufen.

Legacy-Unterstützung im Membrane API Gateway

Das Open-Source-Tool Membrane API Gateway basiert auf Java und bringt alle nötigen Bibliotheken für Legacy-SOA mit. Es benötigt ca. 150–200 MB Speicher pro Instanz – vertretbar, selbst in großen Service Meshes. Die folgenden Beispiele zeigen, wie sich Legacy-Systeme integrieren lassen.

Bereitstellung eines Webdienstes aus einer WSDL

Mit der WSDL-Unterstützung von Membrane lässt sich ein SOAP-Dienst schnell deployen:

<soapProxy port="443" wsdl="city.wsdl"/>

Die WSDL wird beim Abruf automatisch angepasst, sodass der Dienst über das Gateway erreichbar ist.

Bild: Umschreiben der WSDL-Adressen am API-Gateway

WSDL-Rewriting im API Gateway

Zusätzlich validiert soapProxy Ein- und Ausgaben anhand der XSDs. Der Web Services Explorer unterstützt beim Testen:

Web Services Explorer

Bild: Web Services Explorer

Mocking eines Webdienstes mit SOAP-Body-Template

Membrane erlaubt es, SOAP-Antworten einfach über <soapBody> zu mocken:

<api port="2000">
    <path>/mock-service</path>
    <response>
        <soapBody pretty="true">
            <getCityResponse xmlns="https://predic8.de/cities">
                <country>England</country>
                <population>8980000</population>
            </getCityResponse>
            </soapBody>
    </response>
    <return/>
</api>

Der Payload wird automatisch in ein vollständiges SOAP-Dokument eingebettet.

SOAP-Webdienste als REST-APIs bereitstellen

Legacy-Dienste können als REST-Endpunkte exponiert werden. Beispiel:

<api port="2000" method=”GET”>
    <path>/cities/{city}</path>
    <request>
        <soapBody>
            <getCity xmlns="https://predic8.de/cities">
                <name>${pathParam['city']}</name>
            </getCity>
        </soapBody>
    </request>
    <response>
        <template contentType="application/json">
                {
                "country": "${property.country}",
                "population": "${property.population}"
                }
        </template>
        <setProperty name="country" value="${//country}" language="xpath"/>
        <setProperty name="population" value="${//population}" language="xpath"/>
    </response>
    <log/>
    <target method="POST" url="https://www.predic8.de/city-service"/>
</api>

XPath-Unterstützung

Membrane unterstützt XPath zusätzlich zu JsonPath. Dadurch können XML-Werte gezielt ausgelesen und z. B. für Rate Limiting oder Authentifizierung verwendet werden:

<setProperty name="population" value="${//population}" language="xpath"/>

Fazit

Membrane API Gateway schließt die Lücke zwischen modernen APIs und Legacy-Systemen. Es bietet automatische WSDL-Bereitstellung, SOAP-Body-Templates und die Möglichkeit, SOAP-Dienste als REST bereitzustellen – mit vertretbarem Ressourcenbedarf.

Wie geht's los?

Sieh dir die Beispiele im Ordner examples/web-services-soap der Distribution an.