Criando um webservice para outras pessoas acessarem via programação
Tuesday, December 2, 2008 9:36:12 AM
Irei começar o dia com um post sobre WebServices e espero que gostem.
Este post tem como foco, criar, disponibilizar e acessar seu WebService para teste, aprendendo como liberar partes do seus sistemas para acesso externo e abrindo uma porta para a sincronização de seu sistema com outros, não necessariamente feitos em PHP ou rodando em interpretadores (ISS,Apache).
Requisitos:
Para o entendimento deste post é necessário ter um ou mais requisitos abaixo:
- É de extrema importancia saber criar tabelas no Mysql;
- Entender o que é uma classe, propriedades e métodos;
- Vontade de aprender;
Teoria:
Como o nome ja diz, WebService nada mais é do que um serviço disponibilizado na internet.
Estes serviços podem ser acessados normalmente via TCP/IP e no nosso caso (PHP) utilizaremos HTTP (browser).
O acesso ao conteúdo do webservice, pode ser feito via GET, normalmente utilizado em webservices que somente processam e retornam valores para o usuário, como o calculo de frete dos correios:
http://www.correios.com.br/encomendas/precos/calculo.cfm?cepOrigem=09050530&cepDestino=09090440&peso=10&resposta=xml
Via post, mas este é bem mais dificil de achar, até hoje o único que eu achei foi a muito tempo num cálculo de cep dos correios
e via SOAP - Simple Object Access Protocol que é muito utilizado como um método mais seguro para se transportar dados pois utiliza um arquivo chamado de WSDL - Web Service Definition Language
NuSoap
O PHP5 já vem uma lib de acesso à SOAP, porém utilizaremos uma ferramenta que facilitará a criação de arquivos WSDL e acesso ao próprio WebService chamada NuSoap. Com ele o desenvolvimento ficará mais didátivo pois a maioria dos desenvolvedores utilizam esta ferramenta.
NOTA: Como queremos desenvolver um sistema que independe da linguagem que o desenvolvedor utilizará, não podemos enviar um OBJETO propriamente dito do PHP, pois o sistema que receberá, se não for PHP, não reconhecerá e teremos um grande problema de interoperabilidade, para contornar este problema, enviaremos qualquer retorno via STRING e colocaremos caracteres de escape para separar propriedades e valores.
Iniciando nosso projeto
Faremos um WebService simples que conterá os seguintes serviços.
- Envia para o client os dados cadastrais do cliente (Nome,Endereço,Telefone,Email);
- Mostra todos os e-mails de clientes ATIVOS ou INATIVOS, dependendo do filtro;
Utilizaremos neste post um banco de dados em mysql, assim ficará mais fácil o entendimento.
Criando a tabela de clientes
CREATE TABLE `cliente` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `nome` VARCHAR( 200 ) NOT NULL , `endereco` VARCHAR( 255 ) NOT NULL , `telefone` VARCHAR( 20 ) NOT NULL , `email` VARCHAR( 255 ) NOT NULL , `estado` CHAR( 1 ) NOT NULL ) ENGINE = innodb;
Feito isso, como de costume, iremos criar uma classe mapeada com a tabela do nosso banco, essa prática é chamada de ORM - Object Relational Mapped
Classe mapeada da nossa tabela clientes e os métodos necessários
<?php
/**
* @author Marcus Brasizza
* @category classe
* @package void
* @version 1.0.0
*/
class cliente{
public $id; /* Key Field */
public $nome;
public $endereco;
public $telefone;
public $email;
public $estado;
public function get($prop){
return $this->$prop;
}
public function set($prop,$val){
$this->$prop = $val;
}
public function __construct($id = null){
$conn = mysql_connect('localhost','root','root');
$bd = mysql_select_db('webservice');
if($id != null){
$sql = mysql_query("Select * from cliente where id=$id");
$ler = array();
if(mysql_num_rows($sql) > 0){
while($l = mysql_fetch_array($sql)){
$ler[] = $l['id'];
$ler[] = $l['nome'];
$ler[] = $l['endereco'];
$ler[] = $l['telefone'];
$ler[] = $l['email'];
$ler[] = $l['estado'];
}
$this->__populate($ler);
}
}
}
private function __populate($line){
$properties = '';
$properties = get_class_vars(get_class($this));
if(count($properties) > 0 ){
$i=0;
foreach($properties as $props=>$values){
$this->$props = $line[$i];
$i++;
}
}
}
public function emails($estado){
$sql = mysql_query("Select * from cliente where estado = $estado");
$emails = array();
while($dados = mysql_fetch_array($sql)){
$emails[] = $dados['email'];
}
return implode('*',$emails);
}
/* METODOS DE INTEGRACAO COM O WEBSERVICE */
static function str2Obj($str,$class){
$ex = explode('*',$str);
if(count($ex) > 0 ){
foreach($ex as $ind=>$values){
$x = explode('=',$values);
if(count($x)> 1){
$class->set($x[0],$x[1]);
}
}
}
return $class;
}
public function obj2Str($class) {
$properties = get_class_vars(get_class($class));
if(count($properties) > 0 ){
$str = '';
$i=0;
foreach($properties as $props=>$values){
$str.=$props.'='.$this->$props.'*';
}
return substr($str,0,strlen($str)-1);
}
}
}
?>
Criando o servidor Webservice
<?php
include('../nusoap/lib/nusoap.php');
include('cliente.class.php');
// criação de uma instância do servidor
$server = new soap_server;
// inicializa o suporte a WSDL
$server->configureWSDL('Registros do WSDL','urn:server.clientes');
$server->wsdl->schemaTargetNamespace = 'urn:server.clientes';
// registra o método a ser oferecido
$server->register('dadosCliente', //nome do método
array('id' => 'xsd:integer'), //parâmetros de entrada
array('return' => 'xsd:string'), //parâmetros de saída
'urn:server.dadosCliente', //namespace
'urn:server.dadosCliente#dadosCliente', //soapaction
'rpc', //style
'encoded', //use
'Retorna os dados do cliente em foma de string no seguinte modelo: <strong>propriedade=valor*</strong>' //documentação do serviço
);
$server->register('retornaEmails', //nome do método
array('id' => 'xsd:integer'), //parâmetros de entrada
array('return' => 'xsd:string'), //parâmetros de saída
'urn:server.retornaEmails', //namespace
'urn:server.retornaEmails#retornaEmails', //soapaction
'rpc', //style
'encoded', //use
'Retorna os E-mails de todos os clientes de acordo com os estados escolhidos (1 para ativo ou 0 para inativo) retornará os emails no formato <strong>email1*email2*email3...</strong>' //documentação do serviço
);
function dadosCliente($id){
$cliente = new cliente($id);
return $cliente->obj2Str($cliente);
}
function retornaEmails($estado) {
$cliente = new cliente();
return $cliente->emails($estado);
}
// requisição para uso do serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
Se você acessar a url do seu webservice, retornará uma página parecida com essa, que lhe trará a documentação de todos os seus métodos que foram implementados para serem usados via webservice.
Como acessar o webservice
Para acessar o webservice é mais simples que criá-lo com certeza.
Basta instanciar o NuSoap com a url com o WSDL que os métodos que você liberou para o acesso via SOAP ficarão acessíveis:
<?php
include('../nusoap/lib/nusoap.php');
// Definição da localização do arquivo WSDL
$wsdl = 'http://localhost/HANDON/webservices/server.php?wsdl';
// Criação de uma instancia do NUSOAP
$client = new nusoap_client($wsdl,'wsdl');
$dados = ( $client->call('dadosCliente',array('1')) );
echo($dados);
echo "<hr>";
$emails = ($client->call('retornaEmails',array('1')));
echo($emails);
?>
Fazendo isso seu código imprimirá:
id=1*nome=Marcus Brasizza*endereco=Rua Tal, 22*telefone=1144332222*email=marcs@t.com.br*estado=1
--------------------------------------------------------------------------------
marcs@t.com.br*mmv@t2.com.br
Desculpem a demora por finalizar o post e prometo que tentarei ser mais regular nos posts!












Unregistered user # Tuesday, December 2, 2008 11:30:12 PM
Unregistered user # Monday, December 8, 2008 1:30:13 PM
Unregistered user # Tuesday, December 9, 2008 9:38:42 AM
Unregistered user # Friday, January 9, 2009 7:32:33 PM
Unregistered user # Sunday, January 11, 2009 11:38:21 PM
Unregistered user # Thursday, March 5, 2009 6:48:18 PM
Marcus Brasizzaartigos # Friday, March 6, 2009 11:13:55 AM
Porem o arquivo server.php sera nada mais doque o arquivo que cria o webservice.. aquele que começa com:
<?php
include('../nusoap/lib/nusoap.php');
include('cliente.class.php');
// criação de uma instância do servidor
$server = new soap_server;
.....
?>
ai vc vai criar um arquivo chamado xpto.php com o codigo cliente e vai fazer simplesmente como diz o artigo.
O codigo foi testado certinho entao realmente foi algum passo que voce nao entendeu mesmo. Espero que agora tenha ajudado.
Abraços!
Luiz NormanhaLuizNormanha # Tuesday, March 24, 2009 11:09:57 PM
Parabéns pela ajuda sobre webservice.
Seguindo o passo a passo do seu artigo, consegui criar a tabela no mysql e rodar o servico mostrando exatamente a tela que vc colocou acima.
Porém o cliente não mostra nada. Para acompanhar coloquei uns echo e vi que o $dados "$dados = ( $client->call('dadosCliente',array('1')) );" esta nulo.
Usos PHP 5.2.1 com Apache 2.2.8 no Windows Vista.
Por favor o que pode estar acontecendo?
Obrigado,
Luiz
Unregistered user # Wednesday, May 27, 2009 12:07:14 PM
Unregistered user # Wednesday, January 13, 2010 11:26:58 PM
Unregistered user # Wednesday, April 7, 2010 6:35:22 PM
Unregistered user # Thursday, June 24, 2010 4:23:05 PM
Unregistered user # Saturday, August 21, 2010 7:59:56 PM
Unregistered user # Wednesday, December 22, 2010 2:41:21 AM
Unregistered user # Monday, August 22, 2011 1:06:18 AM
Unregistered user # Friday, December 23, 2011 5:28:30 PM
Unregistered user # Friday, January 13, 2012 7:25:45 PM