Programação Especialista

Artigos de Programação em Geral

Como utilizar complexTypes no nuSoap

, , , , , ,

Resolvi fazer este post, pelo simples fato de ser uma utilidade para todos os programadores PHP que tem certas dificuldades para trabalhar com webservices, pelo fato de que em 100% dos tutoriais em portugues ou até mesmo artigos, as pessoas simplesmente nos dão exemplos com tipos simples de dados e esquecem que no mundo OOP é impossível viver enviando centenas de dados simples sendo que seria muito mais fácil o envio de um agrupamento de dados como um array de tipos simples, e é isso que irei explicar neste artigo

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

Introdução ao GTK com PHPAutenticar Usuário no Linux utiliando PHP + (passwd ou shadow)

Comments

Unregistered user Monday, September 26, 2011 6:06:30 PM

Davi Gomes writes: Cara, muito bom seu POST, deu pra tirar umas dúvidas. Só que estou com outro probleminha, tenho que desenvolver um webservices que retorna o seguinte XML: 10 1 1 2 UNIMED GUARARAPES 2011-08-22 123 João José da Silva 2011-08-21 02:31:05 22 10 3 50 Cara, já tentei todo tipo de configuração do NuSoap, e não consigo retornar esse XML. Tens alguma dica de como mapear essa estrutura no ComplexType? Desde já agradeço. davigomess@gmail.com

Unregistered user Thursday, November 10, 2011 7:48:51 PM

Anônimo writes: Cara tenho um cliente fazendo um requisição para um ws em axis2 (java). Envio uma mensagem em minha requisição, porém esta chega como null no ws. Provavelmente não esta sendo enviada. tens idéia do pq? código: $wsdl = 'http://localhost:8080/axis2/services/HelloWorld?wsdl'; $client = new nusoap_client($wsdl, true); $result = $client->call('sayHello', array('msg' => 'Msg teste'));

Write a comment

New comments have been disabled for this post.