SOAP com exemplo em PHP

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:

  1. 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.
  2. SoapClient: Criamos uma instância do cliente SOAP usando o WSDL, o que nos permite usar as operações descritas pelo serviço.
  3. Parâmetros: Definimos os parâmetros necessários (neste caso, a cidade e o país) e os passamos na chamada SOAP.
  4. 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 o SoapClient 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 CEP 01001000 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima