Programação Especialista

Artigos de Programação em Geral

Criando um webservice para outras pessoas acessarem via programação

, , , , , ,

Bom dia galera.
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&aacute; os emails no formato &lt;strong&gt;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!

Colocando marca d água em imagens zipadasAgrupar propriedades de várias classes

Comments

Unregistered user Tuesday, December 2, 2008 11:30:12 PM

Diego writes: opa, bom Post ;) pena que nao entendo nada de PHP ainda, mas se puder fazer comparações com Delphi ou Java vai ser legal também! to entrando na parte de programação Web no próximo semestre, aí o bicho pega! : valeu mf! to entrando aqui pela primeira vez hoje, mas vou voltar :) abraço e sucesso!

Unregistered user Monday, December 8, 2008 1:30:13 PM

Anonymous writes: pra que você pede sugestão de post, se você não fez nenhum que o pessoal pediu? perdeu um visitante!

Unregistered user Tuesday, December 9, 2008 9:38:42 AM

Vini writes: Caro, se estivesse realmente vendo o blog, veria que os posts que foram pedidos a maioria deles foram feitas, tem coisas que o eu não achei interessante mostrar e não desenvolvi nenhum artigo, mas obrigado!

Unregistered user Friday, January 9, 2009 7:32:33 PM

Anonymous writes: Cara, aprendi muito com o seu post. Muito obrigado por compartilhar o seus conhecimentos!

Unregistered user Sunday, January 11, 2009 11:38:21 PM

Vini writes: Pô! obrigado pelo comentário. se em cada 100 pessoas que entrarem no blog, 2 aprenderem ou conhecerem conceitos novos ja fico feliz!! Abraços!

Unregistered user Thursday, March 5, 2009 6:48:18 PM

Junior writes: Olá, gostaria de parabeniza-lo pelo artigo mas algo saiu errado... o serviço está ok! mas nao estou conseguinto mostrar os dados do cliente... ja preenchi o banco e nada... tenho minhas duvidas por exemplo... (1)o arquivo "server.php" de onde surgiu? (2) eu chamo o serviço pelo cliente.php? ou pelo ultimo script que vc colocou como por exemplo "index.php?id=1", já que eu coloquei como nome index.php! ???

Marcus Brasizzaartigos Friday, March 6, 2009 11:13:55 AM

Pena que voce nao deixou seu email e nem sei se um dia voltara ao blog.
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

Oi Marcus,

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

Tharcísio writes: Muito bom seu post. Vai contribuir bastante com um projeto que estou desenvolvendo. Parabéns.

Unregistered user Wednesday, January 13, 2010 11:26:58 PM

Rafael writes: Marcus, parabens pelo pelo, ficou muito bom e facil de entender. Me ajudou muito, ainda mais para mim que nao conhecia nada sobre o asunto!! So queria mais sobre a consulta que vai retornar. No caso do lado do cliente.....no seu exemplo ele vai gerar a saida um texto com o separador *. Se eu quiser que esta saida retorna-se uma arquivo xml, tipo como e o exemplo do correio, como poderia fazer?? Desde já obrigado...

Unregistered user Wednesday, April 7, 2010 6:35:22 PM

augustowebd writes: cara muito bom seu post! Parabéns!

Unregistered user Thursday, June 24, 2010 4:23:05 PM

Ozkr writes: Olá marcus! Parabens pelo código... é excelente.., eu gostaría apenas de saber como eu faço para receber no meu cliente uma lista dos resultados, ao inves de apenas um registro retornado..??

Unregistered user Saturday, August 21, 2010 7:59:56 PM

Anonymous writes: Este exemplo esta cumprindo com a finalidade do autor. Explica e mostra o caminho a percorrer para utilizar um webservice servidor/cliente com nusoap. Mas tenho visto acima, muitos que gostam copiar/colar, os espertos que querem fazer, mas não querem aprender. Pra estes ficam ai pedindo e/ou criticando, estudem... Autor, parabéns pela iniciativa. Thanks, --------------------

Unregistered user Wednesday, December 22, 2010 2:41:21 AM

Lucas writes: Marcus, eu tenho um projeto web que está funcionando direitinho! Todo feito em PHP. Gostaria de disponibilizar uma API para meus usuários. Isso é feito com webservice, certo? Pesquisei sobre SOAP e esse seu post foi muito bom! Ainda tem a seguinte dúvida: como esse webservice seria acessado no cliente se fosse utilizado outra linguagem que não for PHP? ASP ou Java, por exemplo. Obrigado! Meu email é moreirapontocom @ gmail.com

Unregistered user Monday, August 22, 2011 1:06:18 AM

Veltman writes: Marcos, Como criar um webservices onde eu possa capturar por get ou xml via Delphi? Hj uso buscar dados de cep desta forma, gostaria de buscar dados do meu banco de dados construindo este webservices. Att. Veltman veltmanws @ gmail.com

Unregistered user Friday, December 23, 2011 5:28:30 PM

Thiago writes: Muito Obrigado por fazer um ótimo post!!! Parabéns!

Unregistered user Friday, January 13, 2012 7:25:45 PM

Cleber Castiglioni writes: Muito Bom! demorei pra achar um post bem explicado!!

Write a comment

New comments have been disabled for this post.