Chamando um WebService SOAP com PHP

Para chamar um serviço no PHP 5 existe uma classe chamada SoapClient. A documentação pode ser encontrada no manual do PHP. Nesse exemplo, vamos utilizar um WebService SOAP de conversão de temperatura que está disponível online: http://www.webservicex.net/ConvertTemperature.asmx?WSDL

O exemplo básico consiste em criar um objeto SoapClient passando o WSDL e invocar o método "__soapCall" passando os parametros adequados. Para isso é só criar uma página PHP com o seguinte conteúdo:

<?php
$client = new SoapClient('http://www.webservicex.net/ConvertTemperature.asmx?WSDL');

$function = 'ConvertTemp';

$arguments= array('ConvertTemp' => array(
                        'Temperature'   => 31,
                        'FromUnit'      => 'degreeCelsius',
                        'ToUnit'        => 'degreeFahrenheit'
                ));
$options = array('location' => 'http://www.webservicex.net/ConvertTemperature.asmx');

$result = $client->__soapCall($function, $arguments, $options);

echo 'Response: ';
print_r($result);
?>

Na linha 2 criamos o objeto SoapClient passando o WSDL como parâmetro. O WSDL não precisa estar necessariamente no servidor do serviço, você pode copiar para o seu próprio servidor. Na linha 3 especificamos o nome da operação a ser executada. Na linha 4 criamos o payload de requisição. Essa parte é muito importante, pois esse payload tem que obedecer o esquema definido dentro do WSDL. Para o nosso caso a estrutura é a seguinte:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ConvertTemp xmlns="http://www.webserviceX.NET/">
      <Temperature>double</Temperature>
      <FromUnit>degreeCelsius or degreeFahrenheit or degreeRankine or degreeReaumur or kelvin</FromUnit>
      <ToUnit>degreeCelsius or degreeFahrenheit or degreeRankine or degreeReaumur or kelvin</ToUnit>
    </ConvertTemp>
  </soap:Body>
</soap:Envelope>

O conteúdo dentro da tag Body é a estrutura a ser seguida. Na linha 9 o endpoint do serviço é sobreescrito e na linha 10 realizamos a chamada do serviço e atribuímos a sua resposta à variável "result".

Agora é só executar e verificar a saída. Para outros parâmetro e dados mais elaborados, consulte o manual do PHP.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6