Komunikaty SOAP kodowane przez rpc

Węzły SOAP są konfigurowane przy użyciu konkretnego powiązania WSDL, które ma styl:document(wartość domyślna) lubrpc. Wszystkie operacje zdefiniowane w określonym powiązaniu WSDL są zwykle definiowane z użyciem tego samego użycia, które może być alboliteral(wartość domyślna) lubencoded.

Komunikaty SOAP, które sąrpc-encodedmoże przenosić adnotacje kodowania SOAP, które mają na celu nadanie odbiorcy dodatkowych informacji na temat wysyłanego komunikatu. Następujące cztery typy adnotacji są wspólne:

Tablice i elementy o wielu odwołaniu mogą powodować problemy z współdziałaniem i wymagają konkretnej interwencji programisty przepływu komunikatów w następujący sposób:
  • Jeśli przepływ komunikatów buduje komunikaty wychodzące zawierające tablice SOAP, należy użyć kodu ESQL w celu dodania dowolnych wymaganych atrybutów w następujący sposób:
    • arrayTypedla protokołu SOAP 1.1
    • arraySizeiitemTypedla protokołu SOAP 1.2
  • Jeśli przepływ komunikatów odbiera komunikaty przy użyciu tablic SOAP, należy wyłączyć sprawdzanie poprawności.
  • Jeśli przepływ komunikatów odbiera komunikaty przy użyciu kodowania wielokrotnego, należy wyłączyć sprawdzanie poprawności i, jeśli to konieczne, nawigować w wynikowym drzewie logicznym za pomocąhref(lubref) orazidatrybutów.

xsi: typ

Anxsi:typeAtrybut można dodać do elementu, aby określić jego typ. Na przykład:

<data xsi:type="xsd:string">text</data>

gdzie przedrostek przestrzeni nazwxsijest określone w następujący sposób:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

W przypadku usługi Web Service zbudowanej na podstawie schematu WSDL i schematu XML informacje o typie są już dostępne, axsi:typejest nadmiarowy.

Generalnie podczas budowania wiadomości wychodzącej nie dodaje sięxsi:typekomunikaty NACK. Następujący przykład ESQL pokazuje, jak dodaćxsi:typeinformacje, jeśli są wymagane:

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

Podczas analizowania komunikatu przychodzącego, każdyxsi:typeInformacje są dodawane do drzewa logicznego w taki sam sposób, jak inne atrybuty, w następujący sposób:

(0x03000000:PCDataField):data = 'text' (CHARACTER)
(
  (0x03000100:Attribute)http://www.w3.org/2001/XMLSchema-instance:type = 'xsd:string' (CHARACTER)
)

Styl kodowania

AnencodingStyleAtrybut można dodać do elementu, aby określić używany styl kodowania SOAP. Na przykład:

<tns:op1 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

gdzie przedrostek przestrzeni nazwsoapenvjest zdefiniowany jako przestrzeń nazw koperty SOAP, w następujący sposób:

xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" (SOAP 1.1)
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"   (SOAP 1.2)

Sama wartość jest listą identyfikatorów URI, ale wartości w powszechnym użyciu są następujące:

"http://schemas.xmlsoap.org/soap/encoding/" (SOAP 1.1)
"http://www.w3.org/2003/05/soap-encoding"   (SOAP 1.2)

W SOAP 1.1:encodingStyleAtrybut może być dodany do dowolnego elementu. W protokole SOAP 1.2encodingStyleAtrybut może być dodawany tylko do elementów potomnych treści, nagłówka i szczegółów.

Generalnie budujesz komunikat wychodzący, nie dodajeszencodingStyleAtrybut. Następujący przykład ESQL pokazuje, jak dodaćencodingStyleinformacje, jeśli są wymagane:

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;

Podczas analizowania komunikatu przychodzącego, każdyencodingStyleAtrybuty są dodawane do drzewa logicznego w taki sam sposób, jak inne atrybuty, w następujący sposób:

(0x03000100:Attribute)http://schemas.xmlsoap.org/soap/envelope/:encodingStyle = 
     'http://schemas.xmlsoap.org/soap/encoding/' (CHARACTER)

Tablice

Tablica SOAP to element zawierający sekwencję elementów potomnych tego samego typu. W poniższym przykładzie schematu XML istnieje typ o nazwie dane z dwoma elementami: łańcuchem prostym i tablicą. W schemacie pole o nazwie tablica ma nieokreśloną liczbę elementów potomnych typu łańcuchowego. Nazwa tych elementów potomnych nie jest określona.

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

Przestrzenie nazw używane w przykładzie pochodzą z plików WSDL 1.1 i SOAP 1.1, w następujący sposób:

xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

Poniższy przykład stanowi część poprawnego dokumentu instancji zgodnego ze schematem:

<array soapenc:arrayType="xsd:string[]">
  <item>item1</item>
  <item>item2</item>
</array>

Podczas budowania wiadomości wychodzącej należy dodać odpowiednie atrybuty. Na przykład następujący kod ESQL pokazuje, jak dodaćarrayTypeAtrybut:

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[]';

Atrybuty używane przez SOAP 1.1 i SOAP 1.2 są różne. SOAP 1.1 korzysta zarrayTypeAtrybut. Wielkość tablicy może być określona, ale nie jest wymagana. Protokół SOAP 1.2 korzysta z dwóch osobnych atrybutów. Równoważne atrybuty SOAP 1.2 dla poprzedniego przykładu są następujące:soapenc:itemType="xsd:string"isoapenc:arraySize="2", gdzie przedrostki przestrzeni nazw są definiowane w następujący sposób:

xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenc=" http://www.w3.org/2003/05/soap-encoding"

Jeśli przepływ komunikatów odbiera komunikaty kodowane SOAP zawierające tablice SOAP, należy wyłączyć sprawdzanie poprawności. Podczas analizowania komunikatu przychodzącego nie można sprawdzić poprawności dokumentu instancji względem schematu, ponieważ nazwa pozycji tablicy nie jest zdefiniowana przez schemat.

Wiele odwołań

W poniższym przykładzie przedstawiono komunikat żądania SOAP 1.1 dla pliku WSDLrpc-encodedwywołano operacjęop1:

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

Implementacja protokołu SOAP może reorganizować ten komunikat logiczny w taki sposób, aby używane były elementy wielowarkowe, w następujący sposób:

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

Komunikat jest logicznie równoważny z pierwszym przykładem, ale elementy potomne elementówp1iarrayzostały podzielone na osobne elementy równorzędne, a następnie odwoływane przy użyciuhrefAtrybut.

Wprowadzone elementy, takie jak<data>:

  • Istnieje możliwość odwołania się z więcej niż jednej lokalizacji, co pozwala na to, aby komunikat mógł stwierdzić, że takie elementy są identyczne, w przeciwieństwie do oddzielnych elementów o tej samej wartości. Wielkość komunikatu może zostać zmniejszona, jeśli współużytkowany element jest duży i wielokrotnie się do niego odwołuje.
  • Może bezpośrednio lub pośrednio odwoływać się do siebie, co umożliwia reprezentowanie przez komunikat wykresu zawierającego odwołania cykliczne.

Żadne z tych rozważań nie ma zastosowania do poprzedniego przykładu.

Generalnie podczas budowania komunikatu wychodzącego nie koduje się elementów wielu odwołań, chyba że komunikat reprezentuje wykres. W przeciwnym razie kodowanie multireferencyjne jest opcjonalne. Poniższy przykład ESQL pokazuje, jak zakodować elementy wielowarkowe:

-- ESQL namespace prefixes
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
DECLARE xsd     NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE rpc NAMESPACE 'http://example/rpc';
		
-- define XML namespace prefixes
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;

-- build request message
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';

Podczas analizowania komunikatu przychodzącego elementy o wielu odwołaniu nie są zgodne ze schematem XML z pliku WSDL usługi Web Service. Jeśli sprawdzanie poprawności jest włączone w węźle SOAP, zgłaszany jest wyjątek. Jeśli używane jest kodowanie z wieloma odwołaniem, należy wyłączyć sprawdzanie poprawności.

W przypadku drzewa logicznego zbudowanego z komunikatu można propagować to drzewo do innego węzła SOAP w celu uzyskania danych wyjściowych. Na przykład w przypadku przepływu elewacji, jak pokazano na poniższym diagramie, jeśli węzeł Żądanie SOAPRequest odbiera odpowiedź z użyciem kodowania wielu odniesień, można propagować drzewo logiczne dla odpowiedzi do węzła SOAPReply , a do pierwotnego klienta zwracany jest komunikat SOAP z wieloma odwołaniem do kodowania.

Przepływ fasady

Pierwotny klient musi również rozumieć kodowanie wieloreferencyjne.

Aby manipulować drzewem logicznym dla komunikatu zakodowanego w wielu odwołaniu, należy poruszać się pohrefiidatrybuty w języku ESQL. Te atrybuty różnią się nieco w SOAP 1.1 i SOAP 1.2, w następujący sposób:

  • W SOAP 1.1 element odwołujący się ma atrybuthref="#id"i przywoływany elementid="id".
  • W protokole SOAP 1.2 element odwołujący się ma atrybutref="id"i przywoływany elementid="id".