Olá pessoal. Hoje iremos criar nosso primeiro Web Service em PHP, e de duas maneiras.
Vamos revisar tudo que vimos até agora de uma maneira bem resumida, pois creio que nem todos leram os artigos anteriores, risos.
Um dos principais objetivos dos Web Services é fazer a comunicação entre sistemas heterogêneos de maneira distribuída. Na figura abaixo, temos um exemplo de comunicação entre dois servidores, um deles, dotado dos seguintes “apetrechos” (Windows, ISS, ASP) e outro com (Linux, Apache e PHP).

UDDI (Universal Description,
Discovery and Integration): Descoberta e Publicação
WSDL (Web Service Definition Language): Descrição
SOAP (Simple
Object Access Protocol): Mensagens
Passos 01 e 02: Primeiramente, gera-se o arquivo WSDL para descrever um Web Service, este arquivo geralmente é gerado no formato XML. Nele se encontram o nome da função, variáveis de entrada, saída, tipo dos dados, etc. Estes dados são salvos na UDDI, onde você encontra também a URL para a conexão destes serviços.
Passos 03, 04, 05 e 06: A máquina acessa o UDDI para buscar informações sobre um determinado serviço, através do seu WSDL ela tem acesso ao nome da função e as variáveis de entrada e saída com seus respectivos tipos de dados. Após é feita a comunicação através do protocolo SOAP, utilizando-se o XML como mensagem.
Bom, para mais informações, já sabem, os demais artigos tratam sobre cada tecnologia. Vamos ao que interessa.
Existem duas maneiras mais utilizadas no PHP para se criar um Web Service, uma delas é utilizando-se do módulo SOAP Extension, uma nova extensão disponível a partir da versão 5 do PHP, porém muito limitada e, outra é a utilização de uma API desenvolvida em PHP, denominada de NuSOAP. Sua principal vantagem é o seu suporte embutido ao WSDL.
Obs.: Não vou descrever toda a teoria novamente, então, caso não entenda algum passo mencionado abaixo, favor consultar os artigos anteriores. Os arquivos fontes estão no final do artigo.
01. Utilizando o módulo SOAP Extension do PHP
Onde baixar?
http://phpsoaptoolkit.sourceforge.net/phpsoap/
Configuração
Entre no php.ini e adicione a seguinte linha:
extension=php_soap.dll
Códigos
Como exemplo, vamos criar um Hello Name.
server.php

cliente.php
Acessando cliente.php
Resultado:

02. Utilizando a classe NuSOAP
Onde baixar?
http://sourceforge.net/projects/nusoap/
Configuração
Basta incluir no código fonte. (include “caminho/nusoap.php”;)
Lembre-se!
. Comentar a linha ;extension=php_soap.dll no php.ini. Caso o php_soap.dll esteja ativo a classe nuSOAP não irá funcionar.
. Reiniciar o Apache.
Vamos ao que interessa
server.php

cliente.php

Acessando o cliente.php
Resultado:

Gerando um WSDL com o nuSOAP
server2.php

cliente2.php

Acessando o WSDL no NuSOAP
Adicione (?wsdl) no final do arquivo Server.php (http://caminho/server2.php?wsdl) , ou simplesmente acesso no http://caminho/server2.php e clique em WSDL.

Ao clicar no nome da função (hello, no nosso caso), você tem acesso às informações preenchidas, como parâmetro de entrada, saída, url de acesso, etc.

Outra vantagem do nuSOAP, já citada no início, é a geração do documento WSDL, como visto abaixo.

Dica:
Caso queiram visualizar o conteúdo das mensagens, adicionem o código abaixo no final do cliente.php.
echo '<h2>Requisição</h2>';
echo '<pre>'.htmlspecialchars($client->request).'</pre>';
echo '<h2>Resposta</h2>';
echo '<pre>'.htmlspecialchars($client->response).'</pre>';
// Exibe mensagens para debug
echo '<h2>Debug</h2>';
echo '<pre>'.htmlspecialchars($client->debug_str).'</pre>';
Download dos fontes: aqui.
Espero que o conteúdo desse artigo tenha sido útil. Nos próximos artigos falaremos de Integração de PHP/Java e Segurança em Web Services.
Grande abraço!
Rafael Gonzaga
Gostei muito, parabens ... mas os fontes estão com problema!!! vlw
Rafael Gonzaga
Baxei o NuSOAP e no pacote vem alguns exemplos ... testei para ver e acontece um erro "Fatal error: Cannot redeclare class soapclient in ..." oke pode ser??? obrigo !!!
Mauricio Reckziegel
Caro Rafael, quanto ao link dos fontes, esta quebrado mesmo, mas já estou entrando em contato com a redação do iMasters. Quanto ao seu erro, a questão "redeclare" quer dizer que você declarou mais de uma vez a mesma classe, no caso a soapclient. Cheque se vc não esta carregando duas vezes a lib nusoap.
Rafael Gonzaga
pois eh, o problema eh que eu declarei 1 vez so a classe, a um tempo atraz quando vi um outro artigo aki mesmo no imasters, se não me engano era seu, eu fui atraz para saber mais sobre o NUSOAP, e ja havia aprensentado esse mesmo problema, pq no pacote da classe ja vem alguns exemplos e mesmo sem mexer neles eles ja daum essa msg de erro !!! mais mesmo assim obrigado pela atenção!!! ate a proximo
Rafael Gonzaga
Mauricio, baixe o fonte e percebi q vc fez 2 exemplos, 1 com o NUSOAP e outro com o SOAP do PHP ... qual seria a vantagem de usar a classe NUSOAP?? vlw !!!!
Mauricio Reckziegel
Bom, no artigo mostrei como criar um webservice em PHP, de duas maneiras. Isto porquê existem mais, mas essas são relativamente as mais difundidas e estaveis no mercado. Quanto a SOAP Extension, esta presente junto ao PHP5, porém ela esta bem "enxuta", e dedica-se objetivamente a simples conexão. Acredito que no PHP6 estará mais detalhada. Já a nuSOAP, é um arquivo .php, ou varios arquivos, que trazem funções mais completas, a principal delas o suporte a documentação WSDL, a qual a SOAP Extensions não se preocupa até o presente momento. Para mais informações te aconselho a visitar os links das API e dar uma estuda nas funções presentes, vale a pena.
API nuSOAP : http://dietrich.ganx4.com/nusoap/APIDoc/
SOAP Extensions: http://www.php.net/manual/pt_BR/ref.soap.php
Qualquer dúvida estamos ai. Abraço.
Igor Escobar
Lega este artigo pois ele foi feito em cima da mini curso do Vinícius Costa de Souza (http://www.servtec.eti.br/downloads/WebServicesPHP.pdf)
Mauricio Reckziegel
sobre o comentario acima, lamento informar ao amigo mas os códigos fontes foram baseados no site do php.net, porem, o link citado também é uma ótima referencia...
Marcus Cavalcanti
Quanl a diferença (vantagem) de eu utilizar a opção do NuSOAP pura e o NuSOAP com WSDL?
Pois no artigo, que por sinal é muito bom, vc pois um exemplo com WSDL, queria saber quando utilizar.
Abs
Mauricio Reckziegel
Bom, caso queira saber mais sobre WSDL de uma olhada no meu artigo sobre o mesmo. Resumindo, o WSDL serve para descrever os serviços que uma empresa possui, qual o link de conexao, qual a funcao que vc deve invocar e quais os parametros de entrada e saida. Bem, quando temos serviços publicos, ou seja, quero dizer no sentido de acesso para qualquer um, é necessária estas informações, por isso é utilizado o WSDL, porem, se vc apenas vai utilizar os serviços em uma intranet ou um sistema apenas para você, que vc sabe os caminhos de conexao e os parametros a serem passados vc pode desabilitar a opção de divulgação do WSDL. Grato.
Bruno 'CLeF' Jose Palmeira de Araujo
Bom, parabéns, as matérias estão bem claras e objetivas. Esse exemplo utilizando as funçoes de extensões e biblioteca foram bem úteis para ver o funcionamento, porém eu gostaria de fazer a integração de tecnologias distintas. Só como exemplo, o ASP(.net, mais especificamente, scriptado com C#) e PHP... existe alguma fonte de informações confiável de como proceder, sem muita exaustão?
Muito obrigado!
[]'s
Bruno Vaz de Melo Rodrigues
Mauricio Reckziegel, estou desenvolvendo um sistema e estou fazendo um Webservices em PHP5, só que o meu projeto usa Herança e sempre que vou tentar usar a herança ele da um erro, eu reparei em um comentario seu que no PHP5 o SOAP esta muito enxuto, você já fez algum teste com herança? ele aceita? Obrigado
Bruno Vaz de Melo Rodrigues
Mauricio Reckziegel, estou desenvolvendo um sistema e estou fazendo um Webservices em PHP5, só que o meu projeto usa Herança e sempre que vou tentar usar a herança ele da um erro, eu reparei em um comentario seu que no PHP5 o SOAP esta muito enxuto, você já fez algum teste com herança? ele aceita? Obrigado
Bruno Vaz de Melo Rodrigues
Mauricio Reckziegel, estou desenvolvendo um sistema e estou fazendo um Webservices em PHP5, só que o meu projeto usa Herança e sempre que vou tentar usar a herança ele da um erro, eu reparei em um comentario seu que no PHP5 o SOAP esta muito enxuto, você já fez algum teste com herança? ele aceita? Obrigado
Anderson Roberto Zanardi
Olá! tudo bem?
Eu posso estar falando besteira, mas tem como eu consumir esse tipo de webservice de uma aplicação WinForm (feita em Delphi, por exemplo)?
Obrigado
Anderson
Alex de Oliveira
Maurício, como ficaria um exemplo do server.php onde as funções são na verdade métodos de uma classe?
Mauricio Reckziegel
Olá Alex, tambem podemos declarar uma classe, em vez de funções. Cheque em alguma bibliografia referente a sua linguagem de programação ao qual esta trabalhando. Abraço.
Alex de Oliveira
Legal Maurício, estou desenvolvendo minha aplicação toda em php, tanto o cliente como o servidor mas já vasculhei a net toda e não encontrei fazer efetuar o registro dos métodos da minha classe.
Você saberia me dizer qual é o macete?
Abraço
Alex
Alex de Oliveira
Resolvi o problema com uma "gambearra". Eu declaro e executo os objetos da minha classe dentro de funçõe sno modo estruturado e assim registro as função estruturadas no meu server.
Foi a única maneira que encontrei...
Alexandre Nascimento
Gostaria de saber como posso criar um webservice client em PHP e server em Perl. Você me indicaria alguma tutorial.
Obrigado!
Cristina Belderrain
Maurício,
notei que o exemplo de cliente usando SOAP Extension é muito diferente de outro, mais recente, proposto no blog do João Carlos Medau:
http://javaplane.blogspot.com/2008/06/cliente-de-webservice-em-php.html
No entanto, ambos parecem estar usando a mesma extensão (extension=php_soap.dll).
No exemplo mais recente, a interface WSDL de um web service é recuperada e o cliente é obtido a partir do método getProxy() exposto pela interface. Já no exemplo incluído em seu artigo o cliente é criado a partir do construtor SoapClient().
As duas abordagens coexistem na mesma extensão, ou os exemplos estão usando extensões diferentes?
Obrigada,
Cristina
Você explicou tudo o que se propos a fazer e deixou os fontes ainda para auxilio, muito bom hoje so uso wsdl e antes de eu ler o seu tutorial nem fazia ideia do que era isso. Hoje tenho outras duvidas e nao estou sabendo resolver, se conseguir me ajudar ficarei muito grato se nao der fico da mesma forma, pois o seu tutorial ja foi uma boa ajuda. Eu preciso saber como enviar um arquivo xml pelo soap ou nusoap em php para ser interpretado pelo webservice ao inves de enviar os parametros enviar um xml formatado no padrao soap mesmo. Se tiver como me ajudar e tempo para isso e disposicao eu ficarei muito feliz, pois grato eu ja sou. E creio que ira ajudar muitas outras pessoa tambem, pois sei que tem como fazer, mas nao estou sabendo como. nao sei enviar pelo proxy do nusoap ou soap se e que isso e posssivel. Abracos.
Flavio Oscar
Olá pessoal, boa noite!
Sou novo por aqui e gostaria de saber se alguém pode me ajudar.
Realmente esse tuto é showw, parabens Mauricio, funcionou direitinho...
Porem na hora de publicar, meu servidor descartou a possibilidade de se comentar a linha ";extension=php_soap.dll", indicando q eu alterasse as instancias para evitar o conflito com a função nativa do PHP5.
Gostaria de saber se alguém ja alterou as instancias de soapclient da classe Nusoap ou pode me ajudar, pois ja tentei de várias maneiras e meu código do cliente sempre retorna que a nova classe não foi encontrada:
"Fatal error: Class 'soap_client' not found in..."
obs: alterei soapclient para soap_client.
obrigado a todos que puderem me ajudar
Mauricio Reckziegel
Olá flavio.. obrigado pelo comentario. Amigo, sei que ja deve ter tentado de tudo, porém, pelo erro que esta dando é quanto a localização do arquivo onde consta a classe... acredito que vc deve ter checado já esta informação. Verifique a sua versão o php quanto a utilização de classes e a localização o arquivo... no mais não sei o que poderia ser... abraço
Jorge Augusto Klemm
Bom dia a todos os leitores iMasters e ao Mauricio,
Muito bom a matéria, funcionou legal aqui na minha máquina, até consegui criar um client e conectar a um Webservice Java e funcionou perfeito também.
Minha pergunta é quando recebo o retorno do webservice não está exibindo o conteúdo em xml, está me retornando um array de dados. Estou fazendo alguma coisa errado ? Tem como configurar para fazer isso ? Ou é somente assim que ele funciona ?
Grato,
Jorge Augusto Klemm
opa, consegui fazer funcionar, colocando assim:
header('Content-type: application/xml; charset="iso-8859-1"',true);
porém depois tirei essa função e continua a funcionar..
:) estranho..
Mauricio Reckziegel
muito bom jorge, gosto quando resolver os problemas antes mesmo de eu ve-los.. hehe.. abraço
Boa Tarde Mauricio,
Seria bom se tivesse algo aqui no iMasters sobre Webservice PHP utilizando SSL. Você tem algum conhecimento com PHP + SSL ?
Estou tentando consumir um webservice da SEFAZ (Secretaria da Fazenda Governo do Estado de São Paulo) e tenho tudo o necessário, WSDL, Chave certificadora, etc. Mas ainda não estudei sobre SSL a fundo... Se você ou alguém puder ajudar..
Grato,
Mauricio Reckziegel
olá Jorge,
atualmente não venho mais postando artigos aqui sobre WS, porém, caso necessite de alguma ajuda, favor me encaminhar um email. Grato
Olá pessoal, devido a grande quantidade de emails pedidon uma cópia do meu TCC (de 2006), resolvi disponibiliza-lo em um simples site.... a quem interessar: http://sites.google.com/site/mauricioreckziegel/
Espero que ajude a todos.... obrigado.
Felipe Duardo Sopranzetti Pereira
Muito bom seu artigo!
Estou usando ele como base para fazer um web server PHP
se comunicar com uma aplicação DELPHI, para fazer a replicação
de bases de dados matriz e filial, por gerarem arquivos XML muito grandes..
decidimos zippalos pois sao arquivos de texto para a comunicação, a compactação
ficou muito interessante...
estou usando a class NuSOAP
declarando um ArrayOfBytes no complexType
para receber o XML da aplicação DELPHI sem problemas
mas para retornar um array de bytes nao esta fácil do serviço PHP
para a aplicação DELPHI fiz teste server php client php também não deu
certo...
Mauricio Reckziegel
Olá Felipe, você mencionou com relação a XML, não existe alguma maneira de transformar tudo pra JSON? Talvez no seu caso você tenha uma redução de código em torno de 60%.
Tive alguns problemas também ao trabalhar com Arrays, principalmente quando envolvia javascript nas aplicações por meio de requisições ajax. O JSON supriu minhas necessidades nesses casos. Espero ter ajudado.
Paulo Accetta
parabens, achei muito boa sua explicação. Eu tenho um problema, e gostaria de saber se poderia ser resolvido utilizando um Web Services. O problema é o seguinte.... eu tenho que fazer uma consulta no banco de dados a cada 50 segundos, mas o problema é que eu não gostaria que cada usuário tivesse que executar uma instancia da classe que faz esta consulta, ou seja, eu gostaria que somente o webservice fizesse esta consulta e só distribuisse a resposta, mas as duas coisas tem que acontecer simultaneamente, a consulta tem que ficar atualizando uma variável e um método tem que estar disponível para retornar o resultado. O que não pode acontecer é que o mesmo método que retorna o valor da variável seja o que dispara a consulta com o banco
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.