Os nós SOAP são configurados usando uma ligação de WSDL específica cujo estilo é document (o padrão) ou rpc. Todas as operações definidas em uma determinada ligação de WSDL normalmente são definidas com o mesmo uso, que pode ser literal (o padrão) ou encoded.
As mensagens SOAP que são rpc-encoded podem transportar anotações de codificação SOAP que são destinadas a fornecer ao receptor informações adicionais sobre a mensagem que está sendo enviada. Os quatro seguintes tipos de anotações são comuns:
Um atributo xsi:type pode ser incluído em um elemento para especificar seu tipo. Por Exemplo:
<data xsi:type="xsd:string">text</data>
em que o prefixo de namespace xsi é definido da seguinte forma:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Para um serviço da Web criado a partir do esquema XML e WSDL, a informação de tipo já está disponível e o xsi:type é redundante.
Geralmente, ao construir uma mensagem de saída, você não inclui a informação xsi:type. O exemplo de ESQL a seguir mostra como incluir a informação xsi:type se ela for necessária:
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';
Ao analisar uma mensagem de entrada, qualquer informação xsi:type é incluída na árvore lógica da mesma maneira que outros atributos, conforme a seguir:
(0x03000000:PCDataField):data = 'text' (CHARACTER)
(
(0x03000100:Attribute)http://www.w3.org/2001/XMLSchema-instance:type = 'xsd:string' (CHARACTER)
)
Um atributo encodingStyle pode ser incluído em um elemento para especificar o estilo de codificação SOAP usado. Por Exemplo:
<tns:op1 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
em que o prefixo de namespace soapenv é definido como o namespace do Envelope SOAP, da seguinte forma:
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" (SOAP 1.1)
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" (SOAP 1.2)
O valor propriamente dito é uma lista de URIs, mas os valores de uso comum são os seguintes:
"http://schemas.xmlsoap.org/soap/encoding/" (SOAP 1.1)
"http://www.w3.org/2003/05/soap-encoding" (SOAP 1.2)
Em SOAP 1.1, o atributo encodingStyle pode ser incluído em qualquer elemento. Em SOAP 1.2, o atributo encodingStyle só pode ser incluído nos filhos de Corpo, Cabeçalho e Detalhe.
Geralmente, ao criar uma mensagem de saída, você não inclui o atributo encodingStyle. O exemplo de ESQL a seguir mostra como incluir a informação encodingStyle, se ela for necessária:
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;
Ao analisar uma mensagem de entrada, qualquer atributo encodingStyle é incluído na árvore lógica da mesma maneira que outros atributos, conforme a seguir:
(0x03000100:Attribute)http://schemas.xmlsoap.org/soap/envelope/:encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/' (CHARACTER)
Uma matriz SOAP é um elemento que contém uma sequência de elementos filhos do mesmo tipo. No seguinte exemplo de esquema XML, há um tipo chamado data com dois elementos: uma sequência simples e uma matriz. No esquema, o campo chamado array tem um número não especificado de filhos de sequência de tipos O nome desses elementos filhos não é especificado.
<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>
Os namespaces usados no exemplo são de WSDL 1.1 e SOAP 1.1, conforme a seguir:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
O exemplo a seguir faz parte de um documento de instância válido correspondente ao esquema:
<array soapenc:arrayType="xsd:string[]">
<item>item1</item>
<item>item2</item>
</array>
Quando você cria uma mensagem de saída, é necessário incluir os atributos apropriados. Por exemplo, o ESQL a seguir mostra como incluir o atributo arrayType:
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[]';
Os atributos usados por SOAP 1.1 e SOAP 1.2 são diferentes. SOAP 1.1 usa o atributo arrayType. O tamanho da matriz pode ser especificado, mas não é obrigatório. SOAP 1.2 usa dois atributos separados. Os atributos SOAP 1.2 equivalentes para o exemplo anterior são soapenc:itemType="xsd:string" e soapenc:arraySize="2", em que os prefixos de namespace são definidos conforme a seguir:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc=" http://www.w3.org/2003/05/soap-encoding"
Você deverá desativar a validação se o fluxo de mensagens receber mensagens SOAP codificadas contendo matrizes SOAP. O documento da instância não pode ser validado com relação ao esquema ao analisar uma mensagem de entrada, já que o nome dos itens de matriz não é definido pelo esquema.
O exemplo a seguir mostra uma mensagem de solicitação SOAP 1.1 para uma operação de WSDL rpc-encoded chamada 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>
Uma implementação SOAP pode reorganizar essa mensagem lógica para usar elementos com diversas referências, conforme a seguir:
<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>Elemento de Matriz 0</Item>
<Item>Elemento de Matriz 1</Item>
</soapenc:Array>
</soapenv:Body>
</soapenv:Envelope>
A mensagem é logicamente equivalente ao primeiro exemplo, mas os filhos dos elementos p1 e array foram divididos em elementos irmãos separados e depois referenciados usando o atributo href.
Os elementos introduzidos, como <data>:
Nenhuma dessas considerações se aplica ao exemplo anterior.
Geralmente, ao criar uma mensagem de saída, você não codifica elementos com diversas referências, a menos que a mensagem represente um gráfico. Caso contrário, a codificação com diversas referências será opcional. O exemplo de ESQL a seguir mostra como codificar elementos com diversas referências:
-- Prefixos de namespace ESQL
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE rpc NAMESPACE 'http://example/rpc';
-- definir prefixos de namespace XML
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;
-- construir mensagem de solicitação
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';
Ao analisar uma mensagem de entrada, elementos com diversas referências não correspondem ao esquema XML do WSDL de serviço da Web. Se a validação for ativada em um nó SOAP, uma exceção será emitida. Se você usar a codificação com diversas referências, deverá desativar a validação.
Quando você tem uma árvore lógica construída a partir da mensagem, é possível propagar essa árvore para outro nó SOAP para saída. Por exemplo, com um fluxo de fachada conforme mostrado no diagrama a seguir, se o nó SOAPRequest receber uma resposta usando codificação com diversas referências, será possível propagar a árvore lógica da resposta para o nó SOAPReply, é uma mensagem SOAP com a codificação com diversas referências será retornada para o cliente original.
O cliente original também deve entender a codificação com diversas referências.
Para manipular a árvore lógica de uma mensagem codificada com diversas referências, navegue nos atributos href e id no ESQL. Esses atributos são um pouco diferentes em SOAP 1.1 e SOAP 1.2, conforme a seguir: