Array de ComplexTypes no Nusoap
Wednesday, March 28, 2012 1:14:15 PM
Para entendermos o complexTypes é importante que leiam o artigo anterior de complexTypes Aqui.
Antes da criação desse novo objeto que irei descrever, para retornar mais de um objeto ou mais de um dado era necessário alguns contornos como por exemplo, serializar o objeto e criptografar com base64 ja que o nuSoap reconhece o objeto serializado e recusa o envio.
A nossa criação de coleção de complexTypes usará o mesmo conceito ORM mapeando os campos da tabela em objetos para facilitar a manipulação.
<?php
class ComplexHelper {
private $soap = null;
private $current = '';
/**
*
* @param type $server
* Add an instance of NuSoap to build the complex type
*/
function __construct($server) {
$this->soap = $server;
}
/**
*
* @param type $table
* @return Array
* Build an array with all the fields from the selected table
*/
private function getFields($table) {
$qry = "show fields from {$table}";
$rs = mysql_query($qry);
while ($row = mysql_fetch_array($rs)) {
$campos[] = $row['Field'];
}
return $campos;
}
/**
*
* @param type $table
* @return ComplexHelper
* Build a simple complex type using the fields from a selected table
*/
function SimpleComplexType($table) {
$fields = $this->getFields($table);
if (count($fields) > 0) {
$fieldArr = null;
foreach ($fields as $field) {
$complex[$field] = array(
'name' => $field,
'type' => 'xsd:string'
);
}
}
$this->soap->wsdl->addComplexType(
$table, 'element', 'struct', 'all', '', $complex
);
$this->current = $table;
return $this;
}
/**
*
* @param type $prefix
* Bind an array from a simple complex type
*/
final function bindArray($prefix) {
$table = $this->current;
$fields = $this->getFields($table);
if (count($fields) > 0) {
$fieldArr = null;
foreach ($fields as $field) {
$complex[$field] = array(
'name' => $field,
'type' => 'xsd:string'
);
}
}
$this->soap->wsdl->addComplexType(
$prefix . $table,
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(
$table => array(
'name' => $table,
'type' => 'tns:' . $table
)
),
array(
$table => array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:' . $table . '[]'
)
), 'tns:' . $table
);
}
}
?>
Explicando a classe:
Bom, a classe em sí é bastante simples. O que você terá que fazer é instanciá-la com o objeto do nuSoap como parâmetro e o resto a classe se encarrega de fazer.
Existem 2 funções importantes, a SimpleComplexType e a bindArray.
A bindArray não pode ser usada separado sem ser aninhada a um SimpleComplexType. Pensem que você precisa primeiro criar a estrutura de dados para depois informar que você quer um array com aqueles dados.
Sua utilização:
A utilização é bem simples pois no SimpleComplexType você colocará como parâmetro a tabela do campo que quer que seja criado a estrutura de dados e o bindArray você colocará como parâmetro um prefixo para demonstrar que a coleção é um array para facilitar a sua utilização.
Criaremos a página do WebService que será consumida por outros clientes independente da linguagem:
<?php
include('nuSoap/lib/nusoap.php');
include('ComplexHelper.class.php');
$server = new soap_server;
$nuHelper = new ComplexHelper($server);
// WSDL Support
$server->configureWSDL('My WSDL Services', 'urn:server.businessData');
$server->wsdl->schemaTargetNamespace = 'urn:server.businessData';
mysql_connect('localhost', 'R0oT', 'N0n3P4s5');
mysql_select_db('mydbh');
$nuHelper->SimpleComplexType('cliente')->bindArray('Arr');
// registra o método a ser oferecido
$server->register('last10', //method name
array(), //in
array('return' => 'tns:Arrcliente'), //out
'urn:server.businessData', //namespace
'urn:server.businessData#businessData', //soapaction
'rpc', //style
'encoded', //use
'get information of the latest 10 clients' //description
);
function last10() {
$qry = "select * from cliente order by cod_cli DESC limit 10 ";
$rs = mysql_query($qry);
if (mysql_numrows($rs) > 0) {
$dados = array();
while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) {
$dados[] = $row;
}
}
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);
?>
Até a linha de conexão do banco é tudo normal e tudo padronizado de como deve ser a criação de um WebService.
A linha $nuHelper = new ComplexHelper($server); faz a instância do nosso ComplexHelper como explicado anteriormente mandando como padâmetro nossa instância do nuSoap.
logo mais abaixo fazemos o seguinte comando:
$nuHelper->SimpleComplexType('cliente')->bindArray('Arr'); e isso faz a criação de uma folha de dados cliente e uma coleção de dados correspondente com o prefixo Arr criando a coleção com o nome Arrcliente.
Feito isso podemos utilizar nossos dois complexTypes, cliente e Arrcliente do jeito que bem entendermos, como no exemplo de criação do last10() que coloca como saída a coleção dos 10 últimos clientes.
Espero que tenham entendido a utilização da classe acima e que as utilizações dos WebSerices se tornem cada vez mais enxutas e comuns.
Até a próxima!
ComplexHelper.class.php
index.php (WebService)
complexTypeClient.php (Script para acessar)











