PHP – Utilizando o Tipo de Dados LONG para Acesso de Web Service com NuSOAP

Olá pessoal! Recentemente descobri que o Banco Central possui um web service que permite a consulta de séries históricas dos principais indicadores econômicos. Resolvi desenvolver um pequeno script para acesso ao web service citado para recuperação de alguns indicadores.

Ocorre que os serviços disponibilizados necessitavam do código do indicador, o qual deveria possuir o tipo de dados LONG, comum em outras linguagens mas INEXISTENTE no PHP. Visando facilitar o trabalho utilizei a biblioteca NuSOAP, disponível gratuitamente no site da SourceForge.

Ao definir a variável do código do indexador verifiquei que a mesma era enviada como tipo INT para o serviço e não LONG, ocasionando erro na requisição. Ao definir como STRING o serviço também recusava o parâmetro.

Vasculhando na internet descobri que é possível repassar uma variável do tipo LONG para um web service via PHP. Segue abaixo o exemplo de implementação.

Boa programação para todos!

<?php
/* Testando a implementação de um serviço de acesso ao BACEN */
/* Busca a biblioteca NuSOAP */

require_once('lib/nusoap.php');
/* Cria um valor do tipo LONG para o código 226 */
$valor = new soapval('codigoSerie','long',226,false,false,false);
/* Cria um cliente para acesso ao webservice BACEN */
$client = new soapclient('https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl', 'wsdl');

/* Verifica se ocorreu erro */
$err = $client->getError();

if ($err) {
/* Se teve erro, exibe o mesmo */
echo '<h2>Erro ao acessar WSDL Bacen.</h2><pre>' . $err . '</pre>';
}
/* Chamada o serviço a ser utilizado, nesse caso o de recuperação da última cotação */
/* Nesse ponto utilizamos o método serialize() do objeto $valor para que o NuSOAP codifique o mesmo como do tipo LONG */
/* Caso não fosse utilizado esse método, teriamos um parâmetro do tipo objeto, ocasionando erro na requisição */
$result = $client->call('getUltimoValorVO', $valor->serialize('literal'));
/* Verifique se ocorreu falha*/

if ($client->fault) {
echo '<h2>Erro</h2><pre>';
print_r($result);
echo '</pre>';
} else {
/* Verifica se ocorreu erro */
$err = $client->getError();

if ($err) {
/* Se ocorreu, exibe o erro */
echo '<h2>Erro</h2><pre>' . $err . '</pre>';
} else {
/* Mostra o resultado da requisição */
//echo '<h2>Resultado</h2><pre>';
//print_r($result);

/*Filtra os campos de retorno desejados disponibilizados pelo serviço */
$arResultado["cotacao"] = $result["ultimoValor"]["svalor"];
$arResultado["dataCotacao"] = $result["ultimoValor"]["dia"]."/".$result["ultimoValor"]["mes"]."/".$result["ultimoValor"]["ano"];
$arResultado["oid"] = $result["oid"];
$arResultado["nomeCompleto"] = $result["nomeCompleto"];
$arResultado["anoFim"] = $result["anoFim"];
$arResultado["anoInicio"] = $result["anoInicio"];
$arResultado["mesFim"] = $result["mesFim"];
$arResultado["mesInicio"] = $result["mesInicio"];
$arResultado["diaFim"] = $result["diaFim"];
$arResultado["diaInicio"] = $result["diaInicio"];
$arResultado["periodicidade"] = $result["periodicidade"];
$arResultado["unidadePadrao"] = $result["unidadePadrao"];
}
}

No related posts.

  1. Diego
    jul 20th, 2011 at 11:48 | #1

    Legal aí a dica, Fabricio! Show de bola! Mas fica aqui uma dúvida: o codigo 226 é para qual indicador?? E onde temos acesso a lista desses códigos para buscar o indicador desejado?

    • Fabricio
      jul 20th, 2011 at 19:32 | #2

      Olá Diego,

      Esse código 226 é para recuperar o valor da TR no site do Bacen. Pelo link a seguir você pode verificar todos os indicares que o webservice deles pode retornar: https://www3.bcb.gov.br/sgspub/localizarseries/localizarSeries.do?method=prepararTelaLocalizarSeries

      • Diego
        jul 29th, 2011 at 11:18 | #3

        Fabricio, uma pequena correção: se tentar instanciar do modo citado acima (new soapclient) o nuSoap gera um erro. Corrigindo para (new nusoap_client) fica tudo ok!
        Após ler sobre isso na web, me informei que é um problema de conflito nos nomes das classes. Com essa correção, tudo funcionando 100%!

  2. ago 8th, 2011 at 18:22 | #4

    Usei o new nusoap_client é funcionou perfeitamente.
    Alguma dica de código para pegar uma sequência de valores?
    Gostaria de passar: CodSerie // DataInicial // DataFinal
    desde já agradeço!
    Murta

  3. ago 9th, 2011 at 09:11 | #6

    Obrigado Fabrício..
    tentei aumentar o código da seguinte forma:
    Introduzi mais duas variáveis de data:

    $valor = new soapval(‘codigoSerie’,'long’,433,false,false,false);
    $dataI = new soapval(‘dataInicio’,'string’,’01/01/2011′);
    $dataF = new soapval(‘dataFim’,'string’,’01/07/2011′);

    e reescrevi o $resulte da forma:
    $result = $client->call(‘getValoresSeriesVO’, $valor->serialize(‘literal’), $dataI->serialize(‘literal’), $dataF->serialize(‘literal’));

    Mas não obtive sucesso. Recebi a msg:
    “Found character data inside an array element while deserializing”

    Sou iniciante em PHP!.. alguma dica?
    desde já agradeço
    Murta

  4. ago 10th, 2011 at 13:46 | #7

    pelo que entendi .. não é necessario usar o serialiaze nos demais valores, e é necessário colocar tudo dentro de um array no argumento do call.. mas mesmo assim ainda não consegui.

  5. ago 10th, 2011 at 13:47 | #8

    estudando um pouco mais entendi .. não é necessario usar o serialiaze nos demais valores, e é necessário colocar tudo dentro de um array no argumento do call.. mas mesmo assim ainda não consegui.

  6. Wagner
    nov 8th, 2011 at 16:30 | #9

    Amigos,
    alguém conseguiu fazer a coleta de dados quando temos mais de uma variável, ou seja, alem do codigoSerie as datas?
    estou tentando e não consigo, se puderem me ajudar agradeço.

Deixar um comentário