Se você está se aprofundando no desenvolvimento de sistemas e já encontrou o termo SOAP, certamente, estará explorando um dos padrões mais antigos e robustos para a troca de informações entre sistemas. Portanto, como programador PHP, nada será tão útil nesse momento, o quanto estudar o protocolo SOAP com exemplo em PHP. Além disso, SOAP é um protocolo que facilita a comunicação entre aplicações por meio de chamadas de rede, assegurando uma troca de dados confiável e segura.
Por isso, hoje vamos entender o que é o SOAP, examinar como ele funciona e aprender a criar um exemplo simples usando PHP.
O que é SOAP?
SOAP (Simple Object Access Protocol) foi criado para facilitar a comunicação entre diferentes sistemas, especialmente na web. Além disso, diferentemente do REST, que segue um estilo arquitetural, SOAP é um protocolo que segue padrões rígidos para a troca de mensagens, o que oferece mais robustez e segurança em algumas situações. Contudo, para mais informações sobre o SOAP, veja a definição de SOAP na Wikipedia.
Geralmente, o SOAP utiliza XML para formatar os dados e suas mensagens são transmitidas via HTTP. Contudo, em alguns casos, as mensagens SOAP também serão transmitidas via SMTP. Inclusive, o SOAP é bastante comum em aplicações corporativas, onde a segurança e a padronização se tornam essenciais. Embora seja mais complexo que o REST, SOAP continua sendo uma solução amplamente adotada. Veja mais sobre as diferenças entre SOAP e REST.
Características principais do SOAP
- Extremamente Estruturado: O protocolo SOAP segue rigorosamente regras bem definidas sobre a formatação das mensagens, o que no entanto, torna sua aplicação muito previsível e robusta.
- Usa XML para Troca de Mensagens: SOAP emprega XML para todas as suas mensagens, dessa forma, assegurando que elas sejam legíveis e compatíveis com qualquer sistema que entenda esse formato.
- Independência de Protocolo: Embora seja mais comum executar SOAP sobre HTTP, ele também pode ser usado com outros protocolos, como SMTP ou até FTP, demonstrando sua flexibilidade.
- WSDL (Web Services Description Language): SOAP geralmente é acompanhado do WSDL, um documento XML que descreve o serviço web. Sendo assim, ele define as operações disponíveis, os parâmetros aceitos e como a comunicação deve ocorrer, proporcionando uma padronização clara. Para mais informações, consulte a documentação oficial sobre WSDL no W3C.
Estrutura de uma Mensagem SOAP
Uma mensagem SOAP se divide em quatro partes principais:
- Envelope: Delimita o início e o fim da mensagem SOAP.
- Header: (Opcional) Inclui informações adicionais sobre a mensagem, como autenticação.
- Body: Carrega os dados da mensagem em si, ou seja, a solicitação ou a resposta.
- Fault: (Opcional) Serve para relatar erros que possam ocorrer durante o processamento da mensagem.
Dessa maneira, observe um exemplo de uma estrutura simples de mensagem SOAP a seguir:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.example.com/webservice">
<soapenv:Header/>
<soapenv:Body>
<web:GetUserInfo>
<web:UserId>12345</web:UserId>
</web:GetUserInfo>
</soapenv:Body>
</soapenv:Envelope>
Nesse exemplo, o cliente está enviando uma solicitação para o serviço web pedindo informações de um usuário com o ID “12345”.
Vantagens do SOAP
- Segurança: SOAP oferece mais opções de segurança, como WS-Security, que permite a autenticação, criptografia e integridade dos dados.
Desvantagens do SOAP
- Segurança: SOAP oferece diversas opções de segurança, como o WS-Security, que permite a autenticação, criptografia e garante a integridade dos dados.
- Padronização: O uso de WSDL assegura que todos os sistemas envolvidos saibam exatamente como se comunicar, o que torna SOAP uma excelente escolha para integração com sistemas corporativos.
- Transações Complexas: SOAP é ideal para transações complexas que exigem maior controle, como operações bancárias ou sistemas de pagamento.
Exemplo de uso do SOAP em PHP
Viste que já entendemos bem o que é o SOAP, vamos então explorar através de um exemplo, o uso do SOAP em PHP, criando um cliente simples. Portanto, neste exemplo a seguir, vamos fazer uma solicitação para um serviço fictício que fornece a previsão do tempo.
Criando um cliente SOAP em PHP
O PHP possui uma extensão chamada SoapClient, que torna a integração com serviços SOAP muito mais simples. Agora, vamos ver um exemplo:
<?php
// URL do WSDL (descreve o serviço web)
$wsdl = "http://www.pagina-example.com/webservice?wsdl";
try {
// Cria uma nova instância do cliente SOAP
$client = new SoapClient($wsdl);
// Define os parâmetros para a chamada
$params = [
'city' => 'São Paulo',
'country' => 'BR'
];
// Faz a chamada ao método do serviço SOAP
$response = $client->__soapCall('GetWeatherForecast', [$params]);
// Exibe a resposta
echo "Previsão do tempo para São Paulo: {$response->forecast}";
} catch (SoapFault $excecao) {
// Em caso de erro, exibe a mensagem de falha
echo "Erro: {$excecao->getMessage()}";
}
?>
Como funciona o código:
- WSDL: Primeiro, definimos a URL do WSDL, que é o documento XML que descreve o serviço web. Isso permite que o PHP compreenda como se comunicar com o serviço.
- SoapClient: Criamos uma instância do cliente SOAP usando o WSDL, o que nos permite usar as operações descritas pelo serviço.
- Parâmetros: Definimos os parâmetros necessários (neste caso, a cidade e o país) e os passamos na chamada SOAP.
- Resposta: Capturamos a resposta da chamada SOAP e, neste exemplo, exibimos a previsão do tempo retornada.
Veja mais um exemplo que envolve a ciração de um cliente SOAP para acessar um WebService de consulta de CEP
Criar o Cliente SOAP para consultar Webservice de CEP
O primeiro passo é criar o cliente SOAP que será responsável por se conectar ao Webservice.
<?php
// URL do WSDL do Webservice de CEP
$wsdl = "https://docs.soawebservices.com.br/webservices/cep?wsdl";
try {
// Criando a instância do SoapClient
$client = new SoapClient($wsdl, [
'trace' => true, // Permite capturar as requisições e respostas SOAP para fins de depuração
'exceptions' => true, // Lança exceções em caso de falhas
'cache_wsdl' => WSDL_CACHE_NONE, // Evita cache para garantir que o WSDL esteja sempre atualizado
]);
// Preparando os parâmetros da consulta ao CEP
$params = [
'cep' => '01001000' // CEP a ser consultado
];
// Realizando a chamada SOAP para o método de consulta de CEP
$response = $client->ConsultaCEP($params);
// Exibindo a resposta do Webservice
echo "Resultado da consulta:\n";
print_r($response);
} catch (SoapFault $excecao) {
// Tratamento de exceções em caso de erro
echo "Erro ao consultar o CEP: " . $excecao->getMessage();
}
$wsdl
: A URL do WSDL (Web Services Description Language) define como o Webservice funciona, quais métodos estão disponíveis e quais parâmetros você precisa fornecer.
new SoapClient($wsdl)
: O código cria um cliente SOAP com base no WSDL fornecido. Nesse caso, o array de opções inclui:
'trace' => true
: Isso permite rastrear a requisição e resposta SOAP para fins de depuração.'exceptions' => true
: Essa configuração garante que oSoapClient
lance exceções quando ocorrer um erro.'cache_wsdl' => WSDL_CACHE_NONE
: Com isso, o PHP evita o cache do WSDL, assegurando que sempre utiliza a versão mais recente.
$params
: Aqui, você passa um array com os parâmetros necessários para o método do Webservice. Neste exemplo, o código consulta o CEP 01001000
.
$client->ConsultaCEP($params)
: Em seguida, o código faz a chamada ao método ConsultaCEP
do Webservice, passando os parâmetros fornecidos.
print_r($response)
: Com esta linha, o código exibe o resultado retornado pela API, que pode incluir informações como endereço, cidade e estado.
Bloco catch
: O bloco catch
captura e exibe os erros que podem ocorrer durante a consulta, garantindo que o código lide corretamente com falhas.
Se precisar visualizar os detalhes completos da requisição e resposta SOAP, você pode utilizar os métodos __getLastRequest()
e __getLastResponse()
para depuração. Adicione o seguinte código para exibir essas informações:
echo "Requisição SOAP:\n" . $client->__getLastRequest() . "\n";
echo "Resposta SOAP:\n" . $client->__getLastResponse() . "\n";
Isso permite que você visualize a requisição enviada ao servidor e a resposta recebida. Consulte mais sobre esse exemplo nessa documentação.
Requisição SOAP
Você deve seguir um formato específico para enviar uma requisição SOAP de acordo com a documentação do Webservice de CEP. A mensagem SOAP é estruturada em XML e enviada ao servidor para consultar o CEP desejado.
Veja abaixo um exemplo de uma requisição SOAP para o CEP 01001000
:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cep="http://webservice.cep.example.com/">
<soapenv:Header/>
<soapenv:Body>
<cep:ConsultaCEP>
<cep:cep>01001000</cep:cep>
</cep:ConsultaCEP>
</soapenv:Body>
</soapenv:Envelope>
Estrutura da Requisição
Primeiro, você deve entender a estrutura da requisição:
- Envelope: O envelope SOAP delimita o início e o fim da mensagem. Ele envolve tanto o cabeçalho quanto o corpo da requisição.
- Header: Embora o cabeçalho seja opcional, você pode utilizá-lo para incluir informações adicionais, como autenticação. Neste caso, o exemplo não inclui dados no cabeçalho.
- Body: No corpo da requisição, você especifica o método
ConsultaCEP
e passa o CEP01001000
como parâmetro. - Namespace (
xmlns:cep
): O namespace define o escopo do serviço, incluindo as operações e parâmetros disponíveis. Neste exemplo, ele se refere ao Webservice de CEP.
Resposta SOAP
Após enviar a requisição, o servidor retorna uma resposta SOAP que contém as informações associadas ao CEP consultado. Veja um exemplo de resposta para o CEP 01001000
:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<ConsultaCEPResponse xmlns="http://webservice.cep.example.com/">
<ConsultaCEPResult>
<logradouro>Praça da Sé</logradouro>
<bairro>Sé</bairro>
<cidade>São Paulo</cidade>
<estado>SP</estado>
</ConsultaCEPResult>
</ConsultaCEPResponse>
</soapenv:Body>
</soapenv:Envelope>
Estrutura da Resposta
Agora, ao analisar a estrutura da resposta:
- Envelope: Assim como na requisição, o envelope SOAP delimita a mensagem completa. Ele contém o cabeçalho e o corpo da resposta.
- Header: Neste exemplo, o cabeçalho está vazio, pois a resposta não precisa de informações adicionais.
- Body: O corpo da resposta inclui os dados que você solicitou.
- ConsultaCEPResponse: O método de resposta retorna as informações solicitadas, contendo o resultado da consulta.
- ConsultaCEPResult: Aqui, você encontra as informações do endereço relacionadas ao CEP, como logradouro, bairro, cidade e estado.
Conclusão
Sistemas legados e corporativos frequentemente exigem transações mais seguras e padronizadas. Portanto, ao trabalhar com integrações complexas em grandes empresas, você deve considerar o uso do SOAP, especialmente se estiver desenvolvendo em PHP.
Se você está apenas começando, pode achar o REST uma abordagem mais simples e direta. No entanto, é crucial entender o SOAP, pois ele oferece vantagens específicas, como maior controle e segurança na troca de informações.
Espero que este exemplo tenha ajudado a esclarecer o que é o SOAP e como utilizá-lo com PHP! Se você tiver dúvidas ou sugestões, sinta-se à vontade para deixar nos comentários.