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.

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?
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
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%!
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
Olá!
Você pode acessar o link a seguir e lá são listados os serviços disponíveis no webservice. https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/sgsAjuda.jsp
Nesse caso você teria que usar o serviço getValoresSeriesVO.
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
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.
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.
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.