WebSphere Message Broker, Versão 8.0.0.5 Sistemas operacionais: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte as informações sobre a versão mais recente do produto em IBM Integration Bus, Versão 9.0

Trabalhando com Mensagens SOAP rpc-encoded

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:

  1. xsi:type
  2. encodingStyle
  3. Matrizes
  4. Com diversas referências
Os elementos matrizes e com diversas referências podem causar problemas de interoperabilidade e exigem intervenção específica pelo desenvolvedor do fluxo de mensagens, conforme a seguir:

xsi:type

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

encodingStyle

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)

Matrizes

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.

Com diversas referências

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.

Fluxo de Fachada

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:

Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Última atualização:
        
        Última atualização: 2015-02-28 18:30:46


Tópico de ConceitoTópico de Conceito | Versão 8.0.0.5 | bc19050_