Die SOAP-Knoten werden mithilfe einer bestimmten WSDL-Bindung konfiguriert, deren Stil entweder document (Standardwert) oder rpc ist. Alle innerhalb einer bestimmten WSDL-Bindung definierten Operationen werden normalerweise mit demselben Verwendungsstil definiert, der entweder literal (Standardwert) oder encoded sein kann.
In SOAP-Nachrichten mit dem Stil rpc-encoded können SOAP-codierte Anmerkungen enthalten, die dem Empfänger zusätzliche Informationen zu der gesendeten Nachricht übermitteln. Die folgenden vier Anmerkungstypen werden häufig verwendet:
Ein Attribut vom Typ xsi:type kann einem Element hinzugefügt werden, um dessen Typ anzugeben. Beispiel:
<data xsi:type="xsd:string">text</data>
Dabei ist das Namespace-Präfix xsi wie folgt definiert:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Bei einem Web-Service, der auf einem WSDL- und XML-Schema aufbaut, ist die Typangabe bereits verfügbar und das Element xsi:type deshalb redundant.
Normalerweise wird beim Erstellen einer abgehenden Nachricht die Angabe xsi:type nicht hinzugefügt. Im folgenden ESQL-Beispiel ist dargestellt, wie die Angabe xsi:type hinzugefügt wird, wenn sie erforderlich ist:
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE xsi NAMESPACE 'http://www.w3.org/2001/XMLSchema-instance';
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsi = xsi;
SET OutputRoot.SOAP.Body.rpc:op1.part1.data.(SOAP.Attribute)xsi:type = 'xsd:string';
Bei der Syntaxanalyse einer eingehenden Nachricht, werden eventuell vorhandene xsi:type-Angaben der logischen Baumstruktur auf dieselbe Weise wie andere Attribute hinzugefügt, wie im folgenden Beispiel dargestellt:
(0x03000000:PCDataField):data = 'text' (CHARACTER)
(
(0x03000100:Attribute)http://www.w3.org/2001/XMLSchema-instance:type = 'xsd:string' (CHARACTER)
)
Ein Attribut vom Typ encodingStyle kann einem Element hinzugefügt werden, um die verwendete SOAP-Codierungsdarstellung anzugeben. Beispiel:
<tns:op1 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
Dabei ist das Namespace-Präfix soapenv als der Namespace der SOAP-Rahmenanweisung wie folgt definiert:
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" (SOAP 1.1)
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" (SOAP 1.2)
Der Wert selbst ist eine Liste mit URIs, die folgenden Werte werden jedoch häufig verwendet:
"http://schemas.xmlsoap.org/soap/encoding/" (SOAP 1.1)
"http://www.w3.org/2003/05/soap-encoding" (SOAP 1.2)
In SOAP 1.1 kann das Attribut encodingStyle einem beliebigen Element hinzugefügt werden. In SOAP 1.2 kann das Attribut encodingStyle nur untergeordneten Hauptteil-, Header- und Detailelementen hinzugefügt werden.
Normalerweise wird beim Erstellen einer abgehenden Nachricht das Attribut encodingStyle nicht hinzugefügt. Im folgenden ESQL-Beispiel ist dargestellt, wie die Angabe encodingStyle hinzugefügt wird, wenn sie erforderlich ist:
DECLARE soapenv NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
SET OutputRoot.SOAP.Body.tns:op1.(SOAP.Attribute)soapenv:encodingStyle = soapenc;
Bei der Syntaxanalyse einer eingehenden Nachricht, werden eventuell vorhandene encodingStyle-Attribute der logischen Baumstruktur auf dieselbe Weise wie andere Attribute hinzugefügt, wie im folgenden Beispiel dargestellt:
(0x03000100:Attribute)http://schemas.xmlsoap.org/soap/envelope/:encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/' (CHARACTER)
Ein SOAP-Array ist ein Element, das eine Sequenz untergeordneter Elemente desselben Typs enthält. Im folgenden Beispiel eines XML-Schemas ist der Typ data mit zwei Elementen dargestellt: eine einfache Zeichenfolge und ein Array. In diesem Schema hat das Feld array eine nicht angegebene Anzahl von untergeordneten Elementen vom Typ Zeichenfolge. Auch der Name dieser untergeordneten Elemente ist nicht angegeben.
<xsd:complexType name="ArrayOfString">
<xsd:complexContent mixed="false">
<xsd:restriction base="soapenc:Array">
<xsd:attribute wsdl:arrayType="xsd:string[]" ref="soapenc:arrayType"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="data">
<xsd:sequence>
<xsd:element name="simple" type="xsd:string"/>
<xsd:element name="array" type="tns:ArrayOfString"/>
</xsd:sequence>
</xsd:complexType>
Die im Beispiel verwendeten Namespaces stammen wie folgt aus WSDL 1.1 und SOAP 1.1:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
Das folgende Beispiel ist Teil eines gültigen Instanzdokuments, das dem Schema entspricht:
<array soapenc:arrayType="xsd:string[]">
<item>item1</item>
<item>item2</item>
</array>
Wenn Sie eine abgehende Nachricht erstellen, müssen Sie die entsprechenden Attribute hinzufügen. Im folgenden ESQL-Code wird dargestellt, wie ein Attribut vom Typ arrayType hinzugefügt wird:
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Body.rpc:op1.p1.array.(SOAP.Attribute)soapenc:arrayType = 'xsd:string[]';
In SOAP 1.1 und SOAP 1.2 werden unterschiedliche Attribute verwendet. In SOAP 1.1 wird das Attribut arrayType verwendet. Die Größe des Arrays kann angegeben werden, wenngleich diese Angabe nicht erforderlich ist. In SOAP 1.2 werden zwei separate Attribute verwendet. Die entsprechenden SOAP 1.2-Attribute für das vorherige Beispiel lauten soapenc:itemType="xsd:string" und soapenc:arraySize="2", wenn die Namespace-Präfixe wie folgt definiert sind:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc=" http://www.w3.org/2003/05/soap-encoding"
Wenn der Nachrichtenfluss SOAP-codierte Nachrichten empfängt, die SOAP-Arrays enthalten, müssen Sie die Validierung inaktivieren. Das Instanzdokument kann bei der Syntaxanalyse einer eingehenden Nachricht nicht anhand des Schemas validiert werden, weil der Name des Array-Elements nicht im Schema definiert ist.
Im folgenden Beispiel ist eine Anforderungsnachricht in SOAP 1.1 für eine WSDL-Operation mit dem Stil rpc-encoded und dem Namen op1 dargestellt:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:rpc="http://example/rpc">
<rpc:op1>
<p1>
<simple>text</simple>
<array soapenc:arrayType="xsd:string[]">
<Item>item1</Item>
<Item>item2</Item>
</array>
</p1>
</rpc:op1>
</soapenv:Body>
</soapenv:Envelope>
Mit einer SOAP-Implementierung kann diese logische Nachrichte für die Verwendung von Mehrfachreferenzelementen wie folgt reorganisiert werden:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:rpc="http://example/rpc">
<rpc:op1>
<p1 href="#id1"/>
</rpc:op1>
<rpc:data id="id1">
<simple>text</simple>
<array href="#id2"/>
</rpc:data>
<soapenc:Array id="id2" soapenc:arrayType="xsd:string[]">
<Item>Array Element 0</Item>
<Item>Array Element 1</Item>
</soapenc:Array>
</soapenv:Body>
</soapenv:Envelope>
Die Nachricht ist logisch mit der im ersten Beispiel identisch, doch die untergeordneten Elemente von p1 und array wurden in mehrere gleichgeordnete Elemente aufgeteilt und mithilfe des Attributs href referenziert.
Für die neu eingeführten Elemente, wie z. B. <data>, gilt Folgendes:
Keiner dieser Aspekte trifft auf das vorherige Beispiel zu.
Normalerweise werden beim Erstellen einer abgehenden Nachricht nur dann Mehrfachreferenzelemente codiert, wenn die Nachricht einen Graphen darstellt. Andernfalls ist die Mehrfachreferenzcodierung optional. Im folgenden ESQL-Beispiel wird dargestellt, wie Mehrfachreferenzelemente codiert werden:
-- ESQL-Namespace-Präfixe
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE rpc NAMESPACE 'http://example/rpc';
-- XML-Namespace-Präfixe definieren
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:soapenc = soapenc;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:rpc = rpc;
-- Anforderungsnachricht erstellen
SET OutputRoot.SOAP.Body.rpc:op1.p1.(SOAP.Attribute)href = '#id1';
SET OutputRoot.SOAP.Body.rpc:data.(SOAP.Attribute)id = 'id1';
SET OutputRoot.SOAP.Body.rpc:data.simple = 'text';
SET OutputRoot.SOAP.Body.rpc:data.array.(SOAP.Attribute)href = '#id2';
SET OutputRoot.SOAP.Body.soapenc:Array.(SOAP.Attribute)id = 'id2';
SET OutputRoot.SOAP.Body.soapenc:Array.(SOAP.Attribute)soapenc:arrayType = 'xsd:string[]';
SET OutputRoot.SOAP.Body.soapenc:Array.Item[1] = 'item1';
SET OutputRoot.SOAP.Body.soapenc:Array.Item[2] = 'item2';
Bei der Syntaxanalyse einer eingehenden Nachricht stimmen Mehrfachreferenzelemente nicht mit dem XML-Schema aus der WSDL des Web-Service überein. Wenn in einem SOAP-Knoten die Validierung aktiviert ist, wird eine Ausnahmebedingung ausgelöst. Deshalb müssen Sie bei Verwendung der Mehrfachreferenzcodierung die Validierung inaktivieren.
Wenn Sie auf Basis der Nachricht eine logische Baumstruktur erstellen lassen, können Sie diese Baumstruktur zur Ausgabe an einen anderen SOAP-Knoten weiterleiten. Wenn in einem Fassaden-Nachrichtenfluss, wie er im folgenden Diagramm dargestellt ist, der SOAPRequest-Knoten eine Antwort mit darin enthaltener Mehrfachreferenzcodierung empfängt, können Sie die logische Baumstruktur für die Antwort an den SOAPReply-Knoten weiterleiten. Anschließend wird eine SOAP-Nachricht mit Mehrfachreferenzcodierung an den ursprünglichen Client zurückgegeben.
Auch der ursprüngliche Client muss die Mehrfachreferenzcodierung verarbeiten können.
Um die logische Baumstruktur für eine Nachricht mit Mehrfachreferenzcodierung zu bearbeiten, navigieren Sie in ESQL zu den Attributen href und id. Diese Attribute weisen für SOAP 1.1 und SOAP 1.2 die folgenden geringfügigen Unterschiede auf: