SOAP e PHP

Quando precisamos expor funcionalidades do nosso sistema para terceiros a primeira coisa que vem à cabeça é webservices. Caímos então no dilema: rest ou soap (são as principais até onde conheço…)?

Essa escolha depende de vários fatores, mas se nossa opção for soap vemos que é um pouco chato trabalhar com este protocolo em php. Por isso criei o EasySoap.

Para entender os motivos que me levaram a “reinventar a roda” preciso contextualizar certas coisas.

Definições

O que é SOAP?

SOAP significa Simple Object Access Protocol, ou seja protocolo simples de acesso à objetos. SOAP nasceu dentro de uma tal de Microsoft lá por 1998, seu objetivo era prover a integração entre sistemas, e o principal: ser independente de tecnologia, para isso foi utilizado o XML como forma de serializar as mensagens.

Para definir os métodos existentes no webservice normalmente é utilizado um documento WSDL, nele está descrito tudo o que é transitado no serviço (tipos, mensagens). Os tipos também podem estar definidos em um documento XSD externo.

Em 2000 foi submetida a versão 1.1 à W3C e a partir de 2001 iniciou-se o desenvolvimento da versão 1.2 que foi finalizada em 2005 e teve sua última modificação em 2007.

SOAP vs REST

Como eu falei acima é preciso ter motivos pra escolher entre REST e SOAP, e comparando um com outro (sem considerar: WS-Addressing, WS-Policy, WS-Security, WS-Federation, WS-ReliableMessaging, WS-Coordination, WS-AtomicTransaction, WS-RemotePortlets, etc) eu digo que REST resolve em 99% suas necessidades, mas escolher REST só por não ter XML envolvendo a requisição e a resposta não é a coisa mais sábia.

Várias linguagens possuem fácil integração com SOAP, ou seja, convertem de forma simples o XML trafegado em um objeto definido pro você. Isso facilita muito nossa vida!

SOAP e PHP

O PHP provê uma saída ridiculamente fácil de acessar webservices (SoapClient):

$client = new SoapClient('http://www.lcobucci.com.br/services/simpleCalculator?wsdl");
echo $client->sum(5, 3);

Mais simples que isso é impossível né? Existem outros parâmetros que podem ser passados no construtor do SoapClient.

Agora pra criar webservices o negócio é um pouco mais complexo, para usar com WSDL que, na minha opinião, é o jeito mais correto. Criar o documento “na mão” é um saco, e pra isso temos algumas possibilidades (mais usadas até onde vi): Zend Framework e NuSOAP.

NuSOAP

Biblioteca toda feita em PHP 4 e a extensão SOAP do PHP não pode estar habilitada, preciso falar mais algo??

Zend Framework

Foi a implementação mais interessante que eu vi, porém o auto-discovery dele não é tão automático quanto o nome aparenta e o WSDL padrão gerado por ele tem o binding RPC/Encoded (o que não é uma recomendação da WS-I, pois as mensagens trafegadas tem mais bytes trafegados e são mais difíceis de serem validadas). O estilo é o de menos, porém o auto-discovery tem que ser todo configurado para buscar os objetos e montar os tipos complexos do webservice e isso acaba sendo um pouco chato.

EasySoap

Depois de escrever inúmeros arquivos WSDL na mão resolvi por um basta nisso, e usando meu fork da biblioteca de Annotations do Rasmus Schultz eu tentei facilitar a construção de webservices SOAP.

Como funciona?

Através de Reflection e das annotations @WebService e @WebServiceMethod são buscados os métodos da classe que você informou e todos os tipos são mapeados automaticamente para criar o WSDL.

Caso seja feita uma requisição GET com o parâmetro “wsdl” é exibido o documento WSDL, caso não for passado o parâmetro é gerada uma visualização mais amigável do WSDL usando um XSL chamado WSDL Viewer.

Funcionalidades básicas

  • WSDL gerado no estilo RPC/Literal
  • Totalmente compatível com namespaces
  • Mapeamento dos tipos complexos completamente automático
  • Facilmente configurável atráves das annotations

Roadmap

  • Utilizar herança nos tipos complexos, ao invés de repetir os atributos
  • Possibilitar tambem o binding Document/Literal
  • Facilitar o uso dos WS-*
  • Possibilitar mais XML namespaces (compartilhamento de tipos complexos entre webservices)

Quem quiser mais informações e/ou contribuir pode dar uma olhada no repositório do projeto.

É isso… contribuições, comentários, reclamações??

Anúncios

Tags:, , , , ,

About lcobucci

Passionate PHP Developer

4 responses to “SOAP e PHP”

  1. Gabriel says :

    Eu uso aqui… é bem fácil e funciona bem. Parabéns pelo trabalho!

  2. Jeferson Viana Perito says :

    Simples de configurar!
    Até criei um ticket aqui na empresa para realizar alguns testes, mas foi deixado um pouco de lado por que o projeto mudou o escopo.

  3. Leonardo Andriolli Danieli says :

    Gostei muito da dica do WSDL viewer. fica muito bom para passar aos clientes a documentação do ws!

    Parabéns pelo post!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: