Web Service em PHP
Como cada vez mais surgem novos sistemas de informação de diversas linguagens de programação, surgiram a necessidade de integração de alguns sistemas, mas como desenvolver uma ferramenta que entenda todas linguagens e que seja de fácil acesso? Foi criado o WEB SERVICE que utiliza o protocolo SOAP através do XML para enviar as informações de um sistema � outro. Anteriormente ao XML era usado comandos via “socket” que nada mais é do que um software que fica escutando uma determinada porta do computador, porém é um processo muito trabalhoso!
Abaixo temos um exemplo de um Web Service em php utilizando a classe NUSOAP. Utilizar essa classe é realmente simples!
Então vamos lá:
O primeiro exemplo é o servidor que irá enviar as informações para o cliente. O servidor agora, somente tem uma ação que é retornar um nome de usuário, na situação abaixo é “Andrey Pedro Lefkum”, mas isso pode ser dinâmico, sendo retornado do banco de dados.
Arquivo: soap.php
<?php
require_once(”nusoap.php”);
function retornaUsuarios($parametro) {
$nome = “Andrey Pedro Lefkum”;
return $nome;
}
$objetoSoapServer = new soap_server();
$objetoSoapServer->configureWSDL(’SMSSoap’,'urn:SMSSoap’);
/* Essa funcao nao faz nada */
$objetoSoapServer->register(’retornaUsuarios’
,array(’base’ => ‘xsd:string’)
,array(’return’ => ‘xsd:string’)
,’urn:SMSSoap’
,’urn:SMSSoap#retornaUsuarios’
);
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ”;
$objetoSoapServer->service($HTTP_RAW_POST_DATA);
?>
Esse segundo exemplo é a parte que faz a requisição ao servidor, nesse caso ele é o cliente.
O cliente diz qual será o servidor, e qual a função do servidor que ele quer que retorne, nesse caso é a retornaUsuarios.
Caso não aconteça nenhum erro ele retorna o nome do usuário.
Arquivo: nusoapCliente.php
<?php
require_once(”nusoap.php”);
$parametros = array(’usuarioCodigo’ => 5);
$clienteSoap = new soapclient(”http://localhost/webservice/soap.php”);
$resultado = $clienteSoap->call(’retornaUsuarios’,$parametros);
if($clienteSoap->fault) {
echo “Erro ao acessar o WEBSERVICE<br />Erro: “.$clienteSoap->faultstring;
}
else {
echo “Nome Usu疵io: “.$resultado;
}
?>
Lembrando que o cliente poderia ser feito em qualquer outra linguagem, como JAVA, ASP enfim…
Referências Bibliográficas:
Claudimir Zavalik, Gulilherme Lacerda, José Palazzo M. de Oliveira
www.inf.ufrgs.br/~palazzo/OAI/04%20Software%20Livre%20-%20Web%20Serv.pdf
Mauricio Reckziegel
http://www.imasters.com.br/artigo/4379/webservices/protocolo_de_transporte_padrao_-_soap/
Mauricio Reckziegel
http://www.imasters.com.br/artigo/4422/webservices/descrevendo_um_web_service_-_wsdl/
October 1st, 2007 at 3:53 pm
Olá Andrey,
Em primeiro lugar gostaria de parabenizar pelo post.
Estou com um problema, preciso fazer uma implementação deste webservice confome o exemplo, porém no server, minhas funções na verdade são métodos da classe. Você saberia como me dizer para registar esses métodos da classe??
Att
Alex
October 2nd, 2007 at 5:39 am
Bom dia Alex!
Cara, também desenvolvo orientado a objetos e encontrei esse problema, não tenho certeza mas é bem provável que terá que criar essas functions fora de classes instanciando-as dentro da forma estruturada a OO. Entendeu?
É triste =\
Vou dar uma pesquisada melhor!
Até mais!
October 2nd, 2007 at 8:30 pm
Blz Andrey, fiz dessa maneira como você falou e funcionou sim. Infelizmente vai dar um trabalho a mais, mas como minhas classes já estão prontas é o único jeito.
Abraço
Alex
October 27th, 2007 at 5:55 am
Olá Andrey,
Não estou conseguindo realizar o upload de arquivo via web service. Você sabe precisa fazer algo diferente para passar o tmp_name do arquivo para a função que estão no web service?
Grato
October 27th, 2007 at 3:13 pm
Olá alex… é seguinte o temp_name somente passará o nome do arquivo…
para passar o arquivo vc poderá fazer o UPLOAD para o servidor, depois abrir o arquivo, pegar seu conteúdo e enviá-lo via string, depois no outro lado somente pegá-lo novamente e salvar no lugar desejado.
blza?
Não sei se resolve seu problema!
qualquer coisa to ae
abraço!
October 28th, 2007 at 5:02 am
Olá Andrey, encontrei outra solução para este problema. O que eu tive que fazer foi serializar o arquivo na aplicação cliente usando a função base64_encode do php. Passo isso como parâmetro para o web service e decodifico do outro lado gravando um novo arquivo com o fwrite.
–
Cliente
if($handle = fopen($filename, “r”)){
$data = fread($handle, filesize($filename));
$data = base64_encode($data);
fclose($handle);
reurn $data;
}
–
servidor
if($handle = fopen($destino, “w”)){
fwrite($handle,base64_decode($this->arquivo));
fclose($handle);
return true;
}
Não pude fazer da menira como você falou pq minha aplicação cliente não pode se comunicar diretamente com o servidor.
Mas valeu pela ajuda.
Abraço
Alex
October 28th, 2007 at 5:06 am
Olá Alex!
Era mais ou menos o que queria dizer, talvez não soube me expressar, utilizar o webservices para trasmitir normalmente…
Mas usar a base 64 é ótimo, deixa como se fosse um anexo de e-mail, ou seja, com a mesma codificação base =D
Legal
Até mais Alex!
November 30th, 2007 at 11:16 am
Que arquivo é esse que ele utiliza? require_once(”nusoap.php”);
November 30th, 2007 at 11:48 am
Já achei a classe nusoap.. vlw
November 30th, 2007 at 11:53 am
Olá Josy!
É a classe para utilizar e desenvolver seu WebServices.
April 16th, 2008 at 10:13 am
Alguém sabe se através da lib nunSOAP eu consigo instanciar um webservice feito em vb.bet.
At.
Gabriel.
April 20th, 2008 at 10:27 am
Olá Andrey, cara muito boa sua matéria… e estava lendo os posts deixado a você e parabenizo pelo conhecimento. Queria tirar uma dúvida e tenho certeza que pode me ajudar. Estou desenvolvendo uma aplicação para conectar com um webservice já desenvolvido em uma linguagem X que não sei dizer qual é e tb nao importa neste caso.
Como estou começando com webservices, tenho as seguintes duvidas. A empresa em questão pede para que instanciemos um Objeto e envie esse objeto para o webservice. Como trabalho com OOP não ficou explícito e não sei se entendi mal, mas esse objeto enviado para o WS seria um Array ou uma Classe? Pois até onde ví em todas as matérias e foruns, o WS só objeto do tipo Array. Além disso, ao passar esses objetos ele já devem estar no formato xml? ou pode-se passar apenas o objeto mesmo? nao sei se minha dúvida é clara…
April 21st, 2008 at 1:24 pm
Blza cara entendi sua dúvida. não tenho certeza… mas acho que não da para passar um objeto não…
o que eu faria é utilizar o xml e deixar os elementos e atributos com valores do objeto
Blza?
E Obrigado pelo POST!
August 27th, 2008 at 5:36 pm
Parabens pelo POST foi muito proveitoso para mim
Obrigado pela dedicação.