Fork me on GitHub

Grupo de desenvolvedores de PHP do estado de São Paulo
Próximos encontros e eventos? Visite a página do PHPSP no Meetup

PHP + SOAP

Por em em Artigos

Desde a versão 5.0.1 do PHP fizeram-se disponíveis as classes e funções para trabalhar com SOAP nativamente.

O link para o manual é o que segue: http://php.net/manual/en/book.soap.php

Abaixo veremos como começar a brincar com essa nova funcionalidade que agora nos é disponível.

 

Começando pelo começo: O que é SOAP?

Evitando qualquer tipo de “historinha”, SOAP é uma abreviação de Simple Object Access Protocol, ou Protocolo Simples de Acesso a Objetos. Isto resume basicamente sua funcionalidade: transportar de forma facilitada objetos – talvez a palavra “funcionalidades” coubesse melhor aqui – através de um protocolo bem definido e com um padrão capaz de ser integrado a diversas plataformas.

O SOAP baseia seu protocolo de comunicação no XML, e seu transporte no HTTP. Não significa que o mesmo não possa ser implementado de outras formas, mas este não é o foco deste texto.

SOAP é um dos protocolos mais comuns quando tratamos de sistemas distribuídos e está muito presente no mundo enterprise. Basicamente consiste em dispor uma interface acessível à operações remotas à sua aplicação (costumo dizer que transmite meta-objetos), permitindo a distribuição organizada de suas aplicações e a componentização destas de forma que: (1) uma aplicação pode ser dividida em vários componentes que se utilizam entre si; (2) novas aplicações ou módulos que possam vir a surgir integrados a esta primeira poderão reutilizar componentes utilizando simplesmente a interface de comunicação; e (3) aplicações externas à(s) sua(s) poderão ter um meio de chamar os componentes de interesse na aplicação já existente.

 

O que eu preciso para começar com SOAP?

Este é um assunto que possui uma carga teórica razoalvemente alta, recomendo buscar literaturas relacionadas para poder ter um maior embasamento. Um título que li e recomendo para introdução ao SOAP (entre outros) é o SOA na Prática de Fabio Perez Marzullo através da Novatec.

Um serviço SOAP geralmente vem acompanhado de um WSDL Document – WebService Description Language Document – que é um documento XML com objetivo de descrever as funcionalidades oferecidas, as regras de entrada/saída de dados, autenticação e afins.

Apesar disso, o WSDL não é item obrigatório no PHP e, neste texto, iremos ignorá-lo pois é um tanto trabalhoso e foge do nosso foco aqui.

 

Escrevendo um serviço SOAP com PHP

Conforme indicado no primeiro parágrafo, o suporte nativo ao SOAP nasceu na versão 5.0.1 do PHP e traz consigo duas classes principais: SoapServer e SoapClient. Para iniciarmos o desenvolvimento precisaremos, portanto, de: um servidor http e o interpretador php 5.0.1 ou superior. Estou utilizando para testes sobre este conteúdo o php 5.5 e seu servidor http integrado.

 

Instanciando SoapServer:

A partir deste ponto teremos uma instância de SoapServer. Note que o primeiro parâmetro do construtor foi omitido, isto porque não queremos utilizar um wsdl aqui.

O próximo passo será definir quem será responsável por oferecer a interface de comunicação, neste momento teremos duas opções: um objeto já instanciado ou uma classe.

Vou então criar uma classe de exemplo para que possamos entender estas duas possibilidades:

Ambos formatos funcionarão de acordo.
Ao Final deste trecho de código temos uma chamada à $server->handle(), que irá capturar automaticamente os dados da requisição passados por POST e trabalhar de acordo.

Salve o arquivo com o nome server.php e logo em seguida inicie o servidor http contendo este arquivo em sua pasta raiz. Eu optei por fazer assim: $ php -S localhost:8080

 

Instanciando SoapClient:

Já temos um SoapServer preparado em server.php, agora vamos escrever um SoapClient capaz de se comunicar com ele.

 

Importante! Não rode seu client.php ainda
Isto, é claro, se você pretende rodar client.php do seu navegador. Afinal no exemplo que citei o servidor http é aquele integrado do php 5.4++.
Acontece que este servidor não trabalha com processos paralelos, de forma que se você tentar acessar client.php no seu navegador provavelmente você irá travar seu processo php.
Pode-se testar client.php diretamente da CLI ou utilizando outra instância do servidor integrado do PHP.

O trecho de código acima deveria imprimir algo como “int(25)” na tela, testemos:

 

Desta forma já estamos conseguindo trabalhar com o cliente e servidor SOAP.
Numa próxima devo apresentar bibliotecas para trabalhar com WSDL no PHP e como utilizar o servidor e cliente Soap com um WSDL Document em mãos.

Espero que tenham gostado.

Tags:

Sobre Níckolas Silva

Desenvolvedor php há aproximadamente 4 anos, Níckolas é tecnólogo em Análise e Desenvolvimento de Sistemas, pós graduando em Engenharia de Software com foco em SOA e já esteve envolvido com desenvolvimento de sistemas de telecom e de gestão. Hoje dedica horas de seus dias ao estudo de tecnologias, práticas e técnicas sobre sistemas distribuídos, procurando integrar todas as áreas de atuação através destes estudos. Além disso está presente em todos eventos PHPSP+Pub, pois acredita que conversas, pessoas e cerveja são a chave para aprender e fortalecer conceitos.

Mais posts de .

  • TSMX

    Tenho algumas dúvidas, porque php é uma coisa muito cabulosa pra mim.
    Eu insiro essas 3 classes .php dentro da minha pasta public_html, correto?
    Como é que eu sei que o servidor está rodando e onde está o gatilho pro servidor soap iniciar? Devo abrir o server.php no browser?
    (perdão, estou acostumado com programação pra desktop e isso é meio bizarro pra mim ainda)

  • gustavo

    Nâo precisa fazer nada, o nome do arquivo é server.php só por didática, mas é um arquivo php normal.
    Quando o client é chamado, ele abre uma chamada com o servidor http, que vai rodar o arquivo server.php para aquela requisição, assim, não é necessário dar ‘start’ em nada, apenas no server http (apache, nginx ou o server integrado do php).

    Se não estiver funcionando (e se você estiver usando o server integrado do php), releia a parte de “Atenção!” do post, logo abaixo do “Instanciando o SoapClient”, que pode te ajudar.

  • TSMX

    Aaaaaaah tá, tudo faz mais sentido agora.
    Sim sim, não dá pra rodar o server e o client na mesma instância de servidor, isso é importante, nem tinha me atentado. Valeu :v

  • Opa, blz cara? Aí, não consigo me conectar neste wsdl via php (via .net eu consigo sem problemas)

    http://webservice.correios.com.br/service/rastro/Rastro.wsdl

  • Felipe Mendes

    Cara, explica pra mim a origem e a função desse arquivo “soap.php”, no primeiro exemplo.

    // server.php
    // public SoapServer ( mixed $wsdl [, array $options ] )

    $options = array(
    ‘uri’ => ‘http://localhost:8080/soap.php’ /*<– ESSE AQUI*/
    );
    $server = new SoapServer(null, $options);

    Agradecido.

  • Felipe, desculpe pela demora…

    O atributo “uri” do array $options causa um tanto de confusão na cabeça da galera. Ele só é necessário quando estamos trabalhando SEM wsdl e gera algo como um “id” para o namespace do XML trocado pelo SOAP. Se tu colocar seu nome lá vai funcionar ;)

  • Fala Thiago!

    Cara… tu conseguiu achar a solução? Tentei fazer a conexão e realmente acontece algo muito estranho no PHP. Imagino que tenha a ver com o XSD do wsdl dos correios, que não faz referência ao caminho absoluto do XSD.

    Inclusive se você rodar o comando “sudo tcpdump -nn -vv -A -s 0 -i enp3s0 dst or src host webservice.correios.com.br and port 80” notará que ele chega a baixar o wsdl normalmente.

    Uma solução que eu encontrei é baixar o wsdl para sua máquina e fazer referência a ele. Mas não me agrada muito essa ideia, porque usar um WSDL se justifica justamente em se manter atualizado com a interface dos caras…

  • Eridson Domingos

    Olá Níckolas, bonito post. Diz alí, você pode me ajudar a consumir um Webservice Soap que tem como objectivo listar dados de clientes vindos do SAP?

  • Rafael Pessoa

    Olá, Níkolas.
    Você ficou de mostrar um exemplo de como seria com WSDL. Acontece que estou precisando de um guia nesse sentido. Desta forma, se conhecer algum que possa me ajudar, agradeceria muito.