O SOAP (Simple Object Access Protocol) é um protocolo concebido para trocar informação estruturada num ambiente descentralizado. Usa as tecnologias de XML para definir uma estrutura de mensagens extensíveis que podem ser trocadas sobre uma variedade de protocolos subjacentes. A estrutura foi projectada para ser independente de qualquer linguagem de programação, modelo ou outra implementação específica. O SOAP habilita aplicações cliente a ligarem-se a serviços remotos e invocarem métodos desses serviços. Assim, uma aplicação cliente pode adicionar um serviço disponibilizado na web, ao seu feature set, localizar o serviço SOAP apropriado e invocar o método correcto.
Ao contrário de outras arquitecturas distribuídas, como o COM/COM+ e o CORBA, o SOAP é meramente um protocolo de comunicação. Para conseguirmos comparar com essas arquitecturas temos que implementar o protocolo SOAP como uma arquitectura distribuída.
O SOAP oferece:
- Mecanismo para definir a unidade de comunicação,
- Mecanismo para lidar com erros,
- Mecanismo de extensão que permite evolução,
- Mecanismo entre as mensagens SOAP e o HTTP, representar tipos de dados em XML.
O SOAP pode ser usado numa variedade de sistemas de mensagens e protocolos. As mensagens SOAP são escritas inteiramente em XML e, portanto, são independentes das linguagens e plataformas. Desta forma, um cliente Java usando SOAP, correndo em Solaris, ou um cliente Perl usando SOAP correndo em Linux, podem ligar-se a um servidor Windows 2000 executando SOAP. O protocolo SOAP representa a essência da arquitectura de serviços na web, habilitando diversas aplicações a trocarem dados e serviços.
Pode ver na figura o pedido SOAP. Este pedido é encapsulado dentro de um envelope SOAP (que por sua vez é encapsulado dentro do pedido HTTP, assumindo que estamos a usar HTTP como transporte). O envelope SOAP é dividido em duas partes, um Header (cabeçalho) e um Body (corpo). O SOAP Header aparece imediatamente a seguir à tag XML que abre o envelope, mas o seu uso é opcional.
É provável também, caso o Header exista, que se encontre um ou mais Headers que nos vão fornecendo meta-informação especifica da aplicação. Essa meta-informação pode conter qualquer coisa, embora a especificação do SOAP use o ID da transacção como exemplo.
O SOAP Header:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/s oap-envelope" soap:encodingStyle="http://www.w3.org/2 001/12/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.mysite.com/transact ion/" soap:mustUnderstand="1">234</m:Trans> </soap:Header> ... ... </soap:Envelope>
O SOAP Body contém os argumentos e os nomes dos métodos remotos a serem chamados.
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/s oap-envelope" soap:encodingStyle="http://www.w3.org/2 001/12/soap-encoding"> <soap:Body> <m:GetPrice xmlns:m="http://www.mysite.com/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> </soap:Envelope>
Toda a informação é serealizada usando XML. Embora o SOAP use XML, que é formato de texto, podem ser usadas estruturas, unions e serem passados parâmetros por referência.
A sintaxe do SOAP
A sintaxe do SOAP é muito simples visto usar como base o XML. As regras mais importantes são:
- As mensagens SOAP têm que usar o XML,
- Todas as mensagens têm que ter as tags de envelope e de enconding,
- As mensagens não podem ter referências DTD,
- As mensagens não podem ter instruções de processamento de XML.
Abaixo podem ver o quão simples é a estrutura de uma mensagem SOAP:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/s oap-envelope" soap:encodingStyle="http://www.w3.org/2 001/12/soap-encoding"> <soap:Header> ... ... </soap:Header> <soap:Body> ... ... <soap:Fault> ... ... </soap:Fault> </soap:Body> </soap:Envelope>
SOAP e a performance
Devido ao uso de XML, ao contrário de outros protocolos, a performance do SOAP é um pouco afectada pois existe a necessidade de extrair o envelope SOAP e efectuar o parsing do XML.
Exemplo de uma transacção SOAP
Neste exemplo temos uma aplicação que efectua um pedido ao servidor do preço de um artigo (GetStockPrice
) passando o nome do artigo no parâmetro StockName
. Na resposta é enviado o preço do artigo no parâmetro Price
.
O pedido SOAP:
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/s oap-envelope" soap:encodingStyle="http://www.w3.org/2 001/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>
A resposta SOAP:
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/s oap-envelope" soap:encodingStyle="http://www.w3.org/2 001/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>
Conclusão
Com este artigo pretendeu-se que o leitor fique a perceber, de uma forma superficial, o funcionamento do SOAP. O SOAP não especifica necessidades da informação a ser trocada—isso cabe às aplicações que o usam.
O SOAP é assim uma plataforma sobre a qual informação específica de aplicações pode ser trocada. É um standard que permite grande expansibilidade e interoperabilidade entre sistemas. Esta interoperabilidade poderá naturalmente estar ameaçada se não forem utilizados standards puros SOAP. Nem todos os aspectos foram tratados neste artigo, pelo que se aconselha a pesquisar sobre este assunto.
Ver também…
Como forma de começar a explorar o mundo SOAP é aconselhada a visualização da palestra realizada no SAPO CodeBits, disponível no serviço SAPO Vídeos em http://videos.sapo.pt/vTPQgrAU7b7wcBDilQJf.
Bibliografia
Kennard Scribner e Mark C. Stiver. Understanding SOAP. Sams Publishing.