Como funciona o SOAP – Protocolo Simples de Acesso a Objetos

SOAP

O que é SOAP?

SOAP significa Protocolo Simples de Acesso a Objetos, é um protocolo de comunicação baseado em XML que permite a comunicação de mensagens entre aplicações via HTTP, normalmente utilizado em WebServices.

Uma das grandes qualidades desse protocolo é sua independência de plataforma e linguagem além de ser simples e extensível por utilizar XML.

Construção de uma mensagem SOAP

Pacote SOAP

Mensagem SOAP

Uma mensagem SOAP é um documento XML comum contendo um elemento chamado Envelope que identifica o documento XML como uma mensagem SOAP, um elemento Header que contém informações sobre o cabeçalho do documento, e um elemento Body que é o corpo do documento contendo informações de chamada e resposta, dentro do corpo contém um elemento Fault que contém erros e informações de status.

Sintaxe da mensagem SOAP

A sintaxe de uma mensagem SOAP é bem simples e contem algumas regras, tais como a utilização de XML, o uso dos namespace específicos da mensagem SOAP, seu namespace deve utilizar a codificação definida pela w3c, não deve conter referencia DTD e nem ter instruções de processamento XML.

A baixo segue o esqueleto de uma mensagem:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
…
</soap:Header>

    <soap:Body>
     …
        <soap:Fault>
         …
        </soap:Fault>
    </soap:Body>

</soap:Envelope>

O Elemento Envelope

O elemento Envelope é o elemento raiz da mensagem SOAP. Este elemento define o documento XML como uma mensagem SOAP.

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
	…
	…
</soap:Envelope>

Bem, neste exemplo vimos que no Elemento Envelope temos dois atributos, o xmlns:soap e o soap:encodingStyle. O primeiro define o namespace da Mensagem SOAP se for utilizado um namespace diferente ira gerar erro ao enviar o pacote e sua mensagem será descartada, o segundo atributo define os tipos de dados utilizados no documento.

O Elemento Header

Este elemento contem informações especificas do aplicativo da mensagem SOAP. É um elemento opcional, se ele estiver presente deve ser o primeiro elemento filho do elemento Envelope.

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
  <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

Acima temos um exemplo de um cabeçalho SOAP, os atributos no cabeçalho define como um destinatário deve processar a mensagem SOAP.

O Atributo mustUnderstand

O atributo mustUnderstand pode ser usado para indicar se uma entrada de cabeçalho é obrigatória ou opcional para o destinatário de processar.

Se você adicionar mustUnderstand = “1″ para um elemento filho do elemento Header indica que o receptor deve reconhecer o elemento ao processar o Header. Se o receptor não reconhece o elemento irá falhar ao processar o Header.

O mustUnderstand aceita 0 ou 1.

Exemplo de implementação:

<soap:Header>
  <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>

O Atributo Actor

Uma mensagem SOAP pode viajar do emissor ao receptor passando por diferentes pontos ao longo do caminho até seu ultimo ponto. No entanto uma ou mais partes da mensagem não são destinadas ao ultimo ponto. O Atributo Actor é usado pelo Header para especificar este ponto.

Exemplo de implementação:

<soap:Header>
  <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
soap:actor="http://www.w3schools.com/appml/">234
  </m:Trans>
</soap:Header>

O Elemento Body

O elemento Body contem a mensagem SOAP pretendida que o usuário espera.
Elementos filhos do elemento Body pode conter namespace.

Exemplo:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body>
  <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
	<m:Item>Apples</m:Item>
  </m:GetPrice>
</soap:Body>

</soap:Envelope>

O exemplo acima seria como uma requisição de preço de uma maça.
Podemos interpretar como se fosse a chamada de um método, você tem uma tag m:getPrice que seria o nome do método, e estaria passando um parâmetro m:Item que é a “Apples”.

A resposta SOAP seria como:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body>
  <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices">
	<m:Price>1.90</m:Price>
  </m:GetPriceResponse>
</soap:Body>

</soap:Envelope>

O Elemento Fault

O elemento Fault do SOAP é o elemento de falha aonde possui erros e informações de status de uma mensagem SOAP.
Este elemento é opcional e quando estiver presente deve aparecer como um elemento filho do elemento Body. Ele pode conter os seguintes sub elementos:

SubElemento Descrição
faultcode Código de identificação de erro
faultstring Explicação legível da falha
faultactor Informações sobre o que pode ter provocado a falha
detail Informações especificas sobre o erro

Os códigos de identificação de erro devem ser utilizados da seguinte maneira:

 

Erro Descrição
VersionMismatch Encontrou um namespace inválido para o elemento envelope SOAP
MustUnderstand Um elemento filho imediato do elemento de Header, com o atributo mustUnderstand definido como “1″, não foi compreendido
Cliente A mensagem foi formada incorretamente ou continham informações incorretas
Servidor Houve um problema com o servidor.

Exemplo de implementação:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body>
	…
    <soap:Fault>
     <faultcode>soap:Client</faultcode>
     <faultstring>
          Failed to locate method (ValidateCreditCard) in class
          (examplesCreditCard) at /usr/local/ActivePerl-5.6/lib/
            site_perl/5.6.0/SOAP/Lite.pm line 1555.
        </faultstring>
      </soap:Fault>
</soap:Body>

</soap:Envelope>

Comunicação HTTP SOAP

Como funciona o protocolo HTTP?

O HTTP se comunica através de TCP/IP. Um cliente http conecta a um servidor usando TCP.
Depois que a conexão foi estabelecida o cliente pode enviar uma requisição http para o servidor como:

POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200

O servidor processa a requisição e envia uma resposta HTTP para o cliente. A resposta contem um código de status para indicar falhas ou sucesso.

200 OK
Content-Type: text/plain
Content-Length: 200

No exemplo acima mostramos uma requisição que retornou com sucesso, caso for falha ira retornar algo como :

400 Bad Request
Content-Length: 0

Comunicação SOAP HTTP:

Um método SOAP é uma requisição/resposta HTTP que esta em conformidade com as regras de codificação SOAP especificadas pela W3C

Ou seja: HTTP+XML = SOAP.

Content-Type

Define o tipo MIMEType da mensagem e sua codificação(charset) para o corpo do xml usado na requisição e na resposta.

Content-Length

Especifica o numero de bytes no corpo da requisição e resposta.

Exemplo de comunicação SOAP

Solicitação:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPrice>
	<m:StockName>IBM</m:StockName>
  </m:GetStockPrice>
</soap:Body>
</soap:Envelope>

Resposta:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPriceResponse>
	<m:Price>34.5</m:Price>
  </m:GetStockPriceResponse>
</soap:Body>

</soap:Envelope>

FONTE: http://www.w3schools.com/soap/

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

9 thoughts on “Como funciona o SOAP – Protocolo Simples de Acesso a Objetos

  1. Antes de tudo, parabéns pelo post. Veja se consegue me ajudar, estou com uma dúvida, usando a extensão SOAP do PHP, como eu faço para ter acesso ao arquivo XML, pois preciso colocar uma assinatura digital nele antes de enviar, e pelo que eu vi, a gnt não tem acesso ao arquivo XML propriamente dito. Obrigado.

  2. Pingback: “Fala, professor!” Prova do ICMS-SP área Tributária | Blog IOB Concursos

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>