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

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/
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.
eu só conheço Soap de letrinhas, de objetos é a primeira vez q vejo
Seu post é o melhor que li a respeito disso, prático e objetivo. Parabéns!!
Muito obrigado =)
Muito bom. Parabéns.
Parabens cara, muito bom.
Muito bom…excelente ..
Nunca desenvolvi nada e o post ficou simples e objetivo. Parabéns.