Como utilizar complexTypes no nuSoap
Friday, September 2, 2011 8:12:48 PM
Logo quando começei a desenvolver em plataforma de webServices postei um artigo bem simples sobre como utilizar um webservice que pode ser encontrado aqui. Porém como tantos outros, a explicação foi bem iniciante, com retorno e inserção de tipos simples de dados e que em algumas vezes se torna inviável. O que é um complexType? Complextype é um tipo de dado customizado que é criado pelo desenvolvedor do webservice que definirá o agrupamento de dados, podendo ser até um agrupamento de agrupamento de complexTypes. Como estruturar um WebService com nuSoap utilizando complexTypes:
<?php
include_once('nuSoap/nusoap.php');
$server = new soap_server;
// inicializa o suporte a WSDL
$server->configureWSDL('Registros do WSDL','urn:server.sistema');
$server->wsdl->schemaTargetNamespace = 'urn:server.sistema';
$server->wsdl->addComplexType(
'Pessoa',
'complexType',
'struct',
'all',
'',
array(
'nome' => array('name' => 'nome', 'type' => 'xsd:string'),
'idade' => array('name' => 'idade', 'type' => 'xsd:int'),
'sexo' => array('name' => 'sexo', 'type' => 'xsd:string')
)
);
$server->register('BomDia', //nome do método
array('pessoa' => 'tns:Pessoa'), //parâmetros de entrada
array('return' => 'xsd:string'), //parâmetros de saída
'urn:server.BomDia', //namespace
'urn:server.BomDia#BomDia', //soapaction
'rpc', //style
'encoded', //use
'Envia um bom dia na tela' //documentação do serviço
);
function BomDia($pessoa){
return "Bom dia {$pessoa[nome]} <br> vc tem {$pessoa[idade]}
e do sexo {$pessoa[sexo]}";
}
// 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);
?>
ao acessar sua URL deverá aparecer um informativo do seu webservice:
feito isso basta criar um arquivo cliente para enviar e receber os dados
<?php
include_once('nuSoap/nusoap/lib/nusoap.php');
$soapCliente = new nusoap_client('http://suaUrl/complexType.php?wsdl',false);
$Pessoa = array('nome'=>'Marcus','idade'=>25,'sexo'=>'Masculino');
echo $soapCliente->call('BomDia',array($Pessoa));
?>
que irá lhe retornar a string "Bom dia Marcus vc tem 25 e do sexo Masculino"
Exemplo simples, porém não iremos parar por ai, pois existem muito mais coisas complexas que podem ser feitas com webserice, como por exemplo transportar dados do banco do servidor para o cliente ou do cliente para o servidor.
Pensando numa estrutura ORM (onde a tabela representa um objeto e os campos as propriedades) resolvi criar algumas funções { criarComplexType e getFields } que irão nos facilitar a transportar dados de uma aplicação para outra se necessário.
Nesse exemplo irei criar algo de consulta com o banco em uma tabela cliente, onde iremos digitar o id do cliente e nos retornará todos os dados do mesmo:
<?php
include_once('nuSoap/nusoap/lib/nusoap.php');
mysql_connect('10.5.0.4','user','pass');
mysql_select_db('database');
function getFields($table){
$qry = "show fields from {$table}";
$rs = mysql_query($qry);
while($row = mysql_fetch_array($rs)){
$campos[] = $row['Field'];
}
return $campos;
}
// criação de uma instância do servidor
function criarComplexType($fields){
if(count($fields)>0){
$fieldArr = null;
foreach($fields as $field){
$complex[$field] = array('name' => $field , 'type'=>'xsd:string');
}
}
return $complex;
}
$server = new soap_server;
// inicializa o suporte a WSDL
$server->configureWSDL('Registros do WSDL','urn:server.empresa');
$server->wsdl->schemaTargetNamespace = 'urn:server.empresa';
$fieldsCliente = getFields('cliente');
$complexCliente = criarComplexType($fieldsCliente);
$server->wsdl->addComplexType(
'cliente',
'complexType',
'struct',
'all',
'',
$complexCliente
);
// registra o método a ser oferecido
$server->register('dadosCliente', //nome do método
array('idCli' => 'xsd:string'), //parâmetros de entrada
array('return' => 'tns:cliente'), //parâmetros de saída
'urn:server.dadosEmpresa', //namespace
'urn:server.dadosEmpresa#dadosEmpresa', //soapaction
'rpc', //style
'encoded', //use
'Retorna os dados da empresa' //documentação do serviço
);
function dadosCliente($idCli){
$qry = "select * from cliente where cod_cli = {$idCli}";
$rs = mysql_query($qry);
if(mysql_numrows($rs) > 0){
$dados = array();
while($row = mysql_fetch_array($rs,MYSQL_ASSOC)){
$keys = array_keys($row);
foreach($keys as $key){
$dados[$key] = $row[$key] ;
}
}
}
return $dados;
}
// 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);
?>
Iremos salvar o arquivo chamado serverWs.php
Feito isso,iremos criar um arquivo cliente que irá acessar nosso webservice:
<?php
include_once('nuSoap/nusoap/lib/nusoap.php');
$soapCliente = new nusoap_client('http://localhost/prototipos/serverWs.php?wsdl',false);
$dadosCliente = $soapCliente->call('dadosCliente',array('1'));
echo "<pre>";
print_r($dadosCliente);
exit;
if($dadosCliente == false){
echo "Nenhum cliente encontrado";
}else{
echo($dadosCliente);
}
?>
o resultado serão os dados do cliente
Array
(
[cod_cli] => 1
[nome_cli] => Teste
[ender_cli] =>
[bairro_cli] =>
[cep_cli] =>
[cidad_cli] =>
[uf_cli] => 26
[ddd_cli] => 0
[tel_cli] => 1234-5678
[email_cli] =>
[dnasc_cli] => 0000-00-00 00:00:00
[sexo_cli] => M
[rg_cli] => 12233333445556
[cpf_cnpj_cli] =>
)
As possibilidades são inúmeras, basta vocês terem a criatividade necessária
Arquivos para download:
cpx2.php Servidor
complexTypeClient.php Client












Unregistered user # Monday, September 26, 2011 6:06:30 PM
Unregistered user # Thursday, November 10, 2011 7:48:51 PM