HTTP Binding für namespacelose Elemente

In einem Kundenprojekt sollte ein System an die SAO Suite (11.1.1.5)
angeschlossen werden, das seine Nachrichten zwar als XML-Strukturen
per HTTP-POST verschickt, jedoch keinen Namespace für diese angibt.

Die Möglichkeit die einem hierzu wahrscheinlich als Erstes in den Kopf
kommt, das HTTP Binding, scheitert aber schon im Wizard mit folgender Meldung:

Fehlermeldung des HTTP Bindings bei namenlosen Schemata

Als Alternative den Socket Adapter zu verwenden oder ein Servlet vor das zu
erstellende Composite zu schalten klingt nur nach einer sehr mäßigen Lösung.

Durch gutes Zureden lässt sich das HTTP Binding dann aber doch zur Verarbeitung
von namenlosen XML-Elementen überreden.

Nachfolgend werden die hierzu nötigen Schritte beschrieben. Als Ausgangsbasis
dient dabei das unten aufgeführte Schema. Zu beachten ist, dass kein
Target Namespace oder Default Namespace angegeben ist.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="myElement" type="xsd:string"/>
</xsd:schema>

1. Target Namespace temporär hinzufügen
Um den Wizard zufriedenzustellen muss zunächst temporär das
targetNamespace-Attribut in die Schemadefinition eingefügt werden. Der
eingetragene Namespace ist hierbei nicht weiter wichtig.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://something.com">
  <xsd:element name="myElement" type="xsd:string"/>
</xsd:schema>

2. HTTP Binding Endpunkt erstellen
Jetzt kann im Wizard das Element zur Erzeugung des HTTP Binding
Endpunkts ohne Fehlermeldung ausgewählt werden.

3. Temporären Namespace wieder entfernen
Der eben hinzugefügte Namespace kann nun wieder entfernt werden.

4. WSDL des HTTP Binding Endpunkts anpassen
Da sich der Namespace des Schemas geändert hat, ist die generierte
WSDL des HTTP Binding Endpunkts ungültig geworden. In dieser muss
das Import-Element, wegen des fehlenden Namespaces, in ein
Include-Element geändert und das Namespaceprefix vor dem Message-Type
entfernt werden.

...
    <wsdl:types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema">
            <include schemaLocation="schema.xsd"/>
        </schema>
    </wsdl:types>
    <wsdl:message name="myElement_msg_in">
        <wsdl:part name="myElement" element="myElement"/>
    </wsdl:message>
...

5. Deployment und Test
Der HTTP Binding Endpunkt sollte nun mit Nachrichten ohne Namespace
aufrufbar sein. Die Testkonsole im EM quittiert an dieser Stelle ihren
Dienst zwar mit einer SoapTestException, normale HTTP-POST
Nachrichten, etwa per curl, werden jedoch korrekt verarbeitet.

Nachfolgend noch zwei Screenshots aus dem EM.

Ablauf im EM

Die Nachricht ist im EM erkennbar:Nachricht im EM

6. Viel Spaß damit haben

Dieser Beitrag wurde unter BPM & System Integration, Software Engineering abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s