SOAP – Simple Object Access Protocol
Introdução
SOAP é um protocolo simples baseado em XML que permite aplicações trocarem informações usando o protocolo HTTP, ou seja é um protocolo usado para acessar Web Serviçes.
Características
– É um protocolo de comunicação
– É utilizado para comunicação entre aplicativos
– É um formato para envio de mensagens
– SOAP é usado para comunicação através da internet
– É independente de plataforma
– É independente da linguagem
– É baseado em XML
– É simples e extensível.
– Permite contornar firewalls
– É uma recomendação da W3C
Por que utilizar SOAP?
Ele é um protocolo importante pois permite a comunicação entre programas utilizando a Internet.
Atualmente as aplicações se comunicam usando Remote Procedure Calls (RPC) usando objetos como DCOM e CORBA, mas o HTTP não foi projetado para esse tipo de aplicação. O RPC apresenta problemas de compatibilidade e segurança, por isso firewall e servidores proxy normalmente bloqueam esse tipo de tráfego, o protcolo RPC roda na porta 135 TCP.
Como a melhor maneira de se comunicar entre as aplicações é através de HTTP, e o HTTP é suportado por todos os navegadores de internet e servidores foi desenvolvido o SOAP para fazer isso.
Estrutura do protocolo SOAP
Uma mensagem SOAP é um documentos XML simples que contém os seguintes elementos:
- Um elemento Envelope, que identifica o documento XML com sendo uma mensagem SOAP.
- Um elemento Header que contem as informações de cabeçalho.
- Um elemento Body, que contem as informações de chamadas e respostas.
- Um elemento Fault, que contem erros e informações de status.
No endereço http://www.w3.org/2001/12/soap-envelope pode-se ver um exemplo de mensagem usando o SOAP
Regras de Syntaxe
Algumas das regras de sintaxe do SOAP são as seguintes:
- Uma mensagem SOAP deve ser codificada usando XML
- Uma mensagem SOAP usa o SOAP Envelope namespave
- Uma mensagem SOAP deve suar o SOAP Encoding namespace
- Uma mensagem SOAP não contem referencia DTD.
- Uma mensagem SOAP não contêm instruções de processamento XML
Estrutura de uma mensagem SOAP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?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 primeiro elemento de uma mensagem SOAP.
O elemento SOAP Envelope
O elemento Envelope é o elemento raiz de uma mensagem SOAP, este elemento define o documento XML como sendo uma mensagem SOAP.
1 2 3 4 5 6 |
<?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"> ... Message information goes here ... </soap:Envelope> |
O namespace xmlns:soap
Este namespace define o envelope como um envelope SOAP, por isso sempre tem que ser usado esse valor “http://www.w3.org/2001/12/soap-envelope” caso seja utilizado um valor diferente a aplicação irá gerar um erro e descartar a mensagem.
O atributo encodingStyle
Este atributo é usado para definir o tipo de dados que está sendo usado no documento. Este atributo pode aparecer em qualquer elemento SOAP, e define o conteúdo do elemento e todos os seus filhos.
Uma mensagem SOAP não tem uma codificação padrão.
Sintaxe
soap:encodingStyle=”URI”
O elemento Header
O elemento opcional Header contém informações especificas de uma aplicação (como autenticação e etc) relativas a mensagem SOAP.
Se o elemento Header estiver presente, ele deve ser o primeiro elemento filho do elemento Envelope.
1 2 3 4 5 6 7 8 9 |
<?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> |
O exemplo acima contém um elemento Header com um elemento “Trans”, e um atributo “mustUnderstand” de valor 1, e o valor de “Trans” é 234.
O SOAP define 3 atributos no namespace padrão (“http://www.w3.org/2001/12/soap-envelope”), que são eles: mustUndestand, actor e encodingStyle.
Os atributos definidos no Header definem como o receptor deve processar a mensagem SOAP.
O atributo mustUndestand
O atributo mustUndestand pode ser usado para indicar se uma entrada de cabeçalho é obrigatória ou facultativa para o processamento do destinatário.
Se for setado mustUndestand = “1” para o elemento filho do Header vai indicar que o receptor que processar o header deve reconhecer o elemento. Se o receptor não reconhecer o elemento ele irá falhar no processamento do Header.
Sintaxe
soap:mustUnderstand=”0|1″
O atributo actor
Uma mensagem ir do emissor ao receptor passando por diferentes pontos intermediários ao longo do caminho. No entanto , nem todas as partes da mensagem pode ser destinada ao ponto final, em vês disso ela pode ser destinada a um ou mais pontos intermediário no caminho da mensagem.
Sintaxe
soap:actor=”URI”
Exemplo
1 2 3 4 5 6 7 8 9 |
<?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:actor="http://www.w3schools.com/appml/">234</m:Trans> </soap:Header> ... ... </soap:Envelope> |
O atributo encodingStyle
O atributo encodingStyle é usado para definir o tipo de codificação que será usado no documento. Este atributo pode aparecer em qualquer elemento SOAP, e ele será válido para o elemento e todos os filhos dele.
Uma mensagem SOAP não tem uma codificação padrão.
Sintaxe
soap:encodingStyle=”URI”
O elemento Body
O elemento Body contém a mensagem SOAP que é destinada ao receptor da mensagem.
Os elementos filhos do elemento Body podem ser qualificados pela namespace.
Exemplo
1 2 3 4 5 6 7 8 9 |
<?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 faz a requisição do preço das maças. Verifique que os elementos m:GetPrice e Item são elementos específicos da aplicação. Estes elementos não fazem parte do namespace do SOAP.
A resposta SOAP pode ser vista abaixo:
1 2 3 4 5 6 7 8 9 |
<?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 opcional Fault é usado para indicar mensagem de erro.
Se este elemento estiver presente, ele aparecera como filho do elemento Body. O elemento Fault só pode aparecer uma vês em cada mensagem SOAP.
O elemento Fault tem os seguintes sub elementos:
Sub elemento | Descrição |
---|---|
< faultcode > | Um código para identificar o Fault |
< faultstring > | Uma explicação legível da falha. |
< faultactor > | Informação porque a falha aconteceu |
< detail > | Informações especificas relacionadas a falha |
Códigos SOAP Fault
Os valores do faultcode estão definidos na tabela abaixo e são usados por ele para descrever falhas:
Erro | Descrição |
---|---|
VersionMismatch | Foi encontrado um namespace inválido para o elemento Envelope |
MustUndestand | Um filho imediato do elemento Header que esta com o atributo mustUndestand setado para 1 não foi compreendido. |
Client | A mensagem foi incerretamente formatada ou contem informações incorretas |
Server | Há um problema com o servidor e a mensagem não pode ser processada. |
O protocolo HTTP
O protocolo HTTP se comunica sobre TCO/IP, um cliente HTTP se conecta a um servidor usando o TCP. Após a conexão estar estabelecida, o cliente pode enviar uma requisição HTTP:
POST /item HTTP/1.1
Host: 189.123.345.239
Content-Type: text/plain
Content-Length: 200
O servidor processa a requisição e envia uma resposta HTTP de volta ao cliente. A resposta contém um status que indica o status da requisição:
200 OK
Content-Type: text/plain
Content-Length: 200
No exemplo acima o servidor retornou o código de status 200, sendo este o código de sucesso do HTTP.
Caso o servidor não consiga interpretar a solicitação, ele pode retornar uma mensagem como está:
400 Bad Request
Content-Length: 0
SOAP HTTP Binding
Um metodo SOAP é uma request/response HTTP que cumpre as regras de codificação SOAP.
Uma requisição SOAP pode ser um HTTP POST ou um HTTP GET . O HTTP POST especifica pelo menos dois cabeçalhos: Content-Type e Content-Lenght.
Content-Type
O cabeçalho Content-Type nas requisições e respostas SOAP definem o MIME type da mensagem e opcionalmente a codificação usada no corpo do XML em requisições e respostas.
Sintaxe
Content-Type: MIMEType; charset=character-encoding
Exemplo
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Lenght
O cabeçalho Content-Lenght usado nas requisições e respostas SOAP especificam o numero de bytes no corpo da requisição ou da resposta.
Sintaxe
Content-Length: bytes
Exemplo
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Exemplo SOAP
No exemplo abaixo, a requisição GetStockPrice é enviada para o servidor. A requisição tem um parâmetro StokeName, e o parâmetro Price será retornado na resposta. O namespace para a função é definida em “http://www.example.org/stock”
Requisição SOAP:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 SOAP:
1 2 3 4 5 6 7 8 9 10 11 12 |
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> |