Terça-feira, 15 de agosto de 2006 às 12h07

Construindo Web Services em PHP

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!

34 comentários

 Rafael Gonzaga
15/08/2006 13h08

Joia

Gostei muito, parabens ... mas os fontes estão com problema!!! vlw

 Rafael Gonzaga
15/08/2006 13h25

Outra coisa :)

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
15/08/2006 13h54

Autor

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
15/08/2006 15h39

Eude novo ^^

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
17/08/2006 09h58

SOAP

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
17/08/2006 14h11

SOAP Extensions x nuSOAP

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.

 Roberto Vieira
27/08/2006 01h07

cara..

muito interessante...

 Igor Escobar
02/10/2006 00h26

Legal..

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
02/10/2006 00h38

autor

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
09/10/2006 15h34

WSDL

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
10/10/2006 11h35

Resposta

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
28/10/2006 21h11

PHP e ASP

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
01/11/2006 10h36

SOAP herança

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
01/11/2006 10h36

SOAP herança

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
01/11/2006 10h37

SOAP herança

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
21/09/2007 16h50

Consumindo por aplicações WinForms

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
30/09/2007 12h40

Script do server.php Orientado a objetos

Maurício, como ficaria um exemplo do server.php onde as funções são na verdade métodos de uma classe?

 Mauricio Reckziegel
30/09/2007 15h02

Respostas

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
01/10/2007 20h39

RE:Script do server.php Orientado a objetos

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
03/10/2007 19h32

RE:Script do server.php Orientado a objetos

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
22/02/2008 02h25

PHP + Perl

Gostaria de saber como posso criar um webservice client em PHP e server em Perl. Você me indicaria alguma tutorial.

Obrigado!

 Cristina Belderrain
23/06/2008 21h40

Cliente SOAP Extension

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

Amigo o seu tutorial esta simplesmente perfeito

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
26/09/2008 20h50

Conflito com PHP5, ajuda para alterar instancia nusopaclient

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
28/10/2008 22h43

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
28/10/2008 09h40

Retornando e exibindo XML

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
28/10/2008 09h54

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
28/10/2008 22h40

muito bom jorge, gosto quando resolver os problemas antes mesmo de eu ve-los.. hehe.. abraço

 Jorge Augusto Klemm
03/11/2008 15h01

WebService PHP + SSL

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
24/11/2008 18h29

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

 Mauricio Reckziegel
24/03/2009 19h49

Trabalho WS

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
17/09/2009 14h24

Retornando um array de bytes

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
17/09/2009 19h17

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
23/10/2009 20h50

Duvida

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

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Mauricio Reckziegel é graduado em Sistemas de Informações pela Universidade Regional do Noroeste do Estado do Rio Grande do Sul e pós-graduado em Tecnologias Aplicadas a Sistema de Informações pelo Centro Universitário Ritter dos Reis. Especialista na tecnologia Web Services, trabalha atualmente com geoprocessamento no desenvolvimento de sistemas de informações geográficos.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.