RC
Webservice client para buscar CEP
Segue uma classe cliente de webservice REST para consultar os dados do endereço, informando o CEP.
No Adianti Template, lembrem-se de alterar o nome do arquivo rest.php.dist para rest.php
Vocês podem utilizar esta funcionalidade incluindo no Form a função abaixo:
Agora que vocês já podem chamar este serviço, segue a classe client webservice.
Sugiro salvá-la na pasta app/service
<xmlcep>
<cep>04822-000</cep>
<logradouro>Rua Jequirituba</logradouro>
<complemento>de 1091/1092 a 1998/1999</complemento>
<bairro>Parque América</bairro>
<localidade>São Paulo</localidade>
<uf>SP</uf>
<unidade></unidade>
<ibge>3550308</ibge>
<gia>1004</gia>
</xmlcep>
*/
/*
******************* FORMATO PIPED *******************
Retorno quando o CEP existe:
cep:51111-000|logradouro:Avenida Boa Viagem|complemento:de 1382/1383 a 2173/2174|bairro:Boa Viagem|localidade:Recife|uf:PE|unidade:|ibge:2611606|gia:
*/
/*
******************* FORMATO QUERTY *******************
Retorno quando o CEP existe:
cep=51111-000&logradouro=Avenida+Boa+Viagem&complemento=de+1382%2F1383+a+2173%2F2174&bairro=Boa+Viagem&localidade=Recife&uf=PE&unidade=&ibge=2611606&gia=
*/
?>
No Adianti Template, lembrem-se de alterar o nome do arquivo rest.php.dist para rest.php
Vocês podem utilizar esta funcionalidade incluindo no Form a função abaixo:
- <?php
- public static function onBuscarCep($param = null)
- {
- try
- {
- $endereco = ConsultaCepService::getCep($param['cep'], 'json');
- if( isset($endereco->erro) )
- {
- throw new Exception($endereco->mensagem);
- }
- else
- {
- //prepara stdClass para preencher o formulario com o endereco retornado
- $object = new stdClass();
- $object->uf = $endereco->uf;
- $object->cidade = $endereco->localidade;
- $object->bairro = $endereco->bairro;
- $object->logradouro = $endereco->logradouro;
- $object->complemento = $endereco->complemento;
- $object->numero = $endereco->unidade;
- //envia os dados para o formulario
- TForm::sendData(self::$formName, $object);
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- ?>
Agora que vocês já podem chamar este serviço, segue a classe client webservice.
Sugiro salvá-la na pasta app/service
- <?php
- /**
- * ConsultaCepService
- *
- * webservice cliente para buscar os dados do CEP, fornecidos pelo site www.viacep.com.br
- * @package service
- * @author Ricardo Câmara (camaramachado@gmail.com)
- * @version 1.0
- */
- class ConsultaCepService
- {
- /**
- * Method getCep
- * Consulta o CEP utilizando o webservice do site www.viacep.com.br
- * @param $cep string - CEP a ser consultado
- * @param $formato string - formato da resposta. Suportados json, xml, piped ou querty.
- * @return stdClass, XML, string (depende do formato) com os dados do CEP
- * Se o CEP não possuir 8 digitos ou não existir, $stdClass->erro retorna TRUE e $stdClass->mensagem informa o erro.
- * Exemplo de uso: $endereco = ConsultaCepService::getCep('99999999');
- */
- public static function getCep($cep, $formato = 'json')
- {
- try
- {
- if( isset($cep) )
- {
- //valida os formatos
- $formatos = ['json', 'xml', 'piped', 'querty'];
- if( !in_array($formato, $formatos) )
- {
- $retorno = new stdClass;
- $retorno->erro = TRUE;
- $retorno->mensagem = "Formato <b>{$formato}</b> não suportado!";
- return $retorno;
- }
- //pega apenas os numeros, retirando os demais caracteres
- $cep = preg_replace("/[^0-9]/", "", $cep);
- //o CEP deve ter 8 digitos
- if( strlen($cep) != 8 )
- {
- $retorno = new stdClass;
- $retorno->erro = TRUE;
- $retorno->mensagem = "CEP: <b>{$cep}</b> não possui 8 digitos!";
- return $retorno;
- }
- switch($formato)
- {
- case 'json':
- $retorno = json_decode( file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}") );
- break;
- case 'xml':
- $retorno = htmlentities(file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}"));
- break;
- case 'piped':
- $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
- break;
- case 'querty':
- $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
- break;
- }
- //checa se o cep não existe, neste caso o atributo erro será TRUE
- if( isset($retorno->erro) )
- {
- $retorno->mensagem = "CEP: <b>{$cep}</b> não existe na base de dados!";
- }
- return $retorno;
- }
- }
- catch (Exception $e)
- {
- echo 'Error: ' . $e->getMessage();
- }
- }
- }
- /*
- ******************* FORMATO JSON *******************
- Retorno quando o CEP existe:
- stdClass Object
- (
- [cep] => 51111-000
- [logradouro] => Avenida Boa Viagem
- [complemento] => de 1382/1383 a 2173/2174
- [bairro] => Boa Viagem
- [localidade] => Recife
- [uf] => PE
- [unidade] =>
- [ibge] => 2611606
- [gia] =>
- )
- Retorno quando o CEP não tem 8 digitos:
- stdClass Object
- (
- [erro] => 1
- [mensagem] => CEP: 5111100 não existe na base de dados!
- )
- Retorno quando o CEP não existe:
- stdClass Object
- (
- [erro] => 1
- [mensagem] => CEP: 99999999 não existe na base de dados!
- )
- Retorno se o formato não for suportado
- stdClass Object
- (
- [erro] => 1
- [mensagem] => Formato java não suportado!
- )
- */
- /*
- ******************* FORMATO XML *******************
- Retorno quando o CEP existe:
- <?xml version="1.0" encoding="UTF-8"?>
<xmlcep>
<cep>04822-000</cep>
<logradouro>Rua Jequirituba</logradouro>
<complemento>de 1091/1092 a 1998/1999</complemento>
<bairro>Parque América</bairro>
<localidade>São Paulo</localidade>
<uf>SP</uf>
<unidade></unidade>
<ibge>3550308</ibge>
<gia>1004</gia>
</xmlcep>
*/
/*
******************* FORMATO PIPED *******************
Retorno quando o CEP existe:
cep:51111-000|logradouro:Avenida Boa Viagem|complemento:de 1382/1383 a 2173/2174|bairro:Boa Viagem|localidade:Recife|uf:PE|unidade:|ibge:2611606|gia:
*/
/*
******************* FORMATO QUERTY *******************
Retorno quando o CEP existe:
cep=51111-000&logradouro=Avenida+Boa+Viagem&complemento=de+1382%2F1383+a+2173%2F2174&bairro=Boa+Viagem&localidade=Recife&uf=PE&unidade=&ibge=2611606&gia=
*/
?>
Boa tarde Ricardo!
Era justamente o que tava procurando... você pode por favor exemplificar um caso de uso em um formulário de cadastro por exemplo.... como deveria ser chamado! Sou novo e estou aprendendo... será de grande valia!
Parabenizo pelo conteúdo compartilhado e conto com seu apoio.
Antecipadamente agradeço.
Bom dia Ricardo!
Quebrando a cabeça aqui consegui fazer uso.
Não sei porque mas só funcionou depois de alterado a linha "TForm::sendData(self::$formName, $object);" removendo o parametro "self::$formName" e deixando só o nome do formulário, ficando assim TForm::sendData('<nome do formulario'>, $object);
Muito obrigado por compartilhar.</nome>
Boa tarde Galera. Não estou conseguindo utilizar o código em meu projeto.
Fiz tudo certinho como no tutorial. Mas, quando coloco para pesquisar um cep. ele me retorna os seguintes erros. "Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /var/www/bkcraft/app/service/ConsultaCepService.php on line 54
Warning: file_get_contents(): Failed to enable crypto in /var/www/bkcraft/app/service/ConsultaCepService.php on line 54
Warning: file_get_contents(https://viacep.com.br/ws/78015245/json): failed to open stream: operation failed in /var/www/bkcraft/app/service/ConsultaCepService.php on line 54"
(LINK DA IMAGEM ABAIXO)
https://imgur.com/a/PEu17lu
Oi Fabrício Almeida,
também passei por este problema, para corrigir a classe ConsultaCepService por esta:
<xmlcep>
<cep>04822-000</cep>
<logradouro>Rua Jequirituba</logradouro>
<complemento>de 1091/1092 a 1998/1999</complemento>
<bairro>Parque América</bairro>
<localidade>São Paulo</localidade>
<uf>SP</uf>
<unidade></unidade>
<ibge>3550308</ibge>
<gia>1004</gia>
</xmlcep>
*/
/*
******************* FORMATO PIPED *******************
Retorno quando o CEP existe:
cep:51111-000|logradouro:Avenida Boa Viagem|complemento:de 1382/1383 a 2173/2174|bairro:Boa Viagem|localidade:Recife|uf:PE|unidade:|ibge:2611606|gia:
*/
Oi Ricardo Câmara,
Muito obrigado!
Bom dia, pessoal, sou novo no adianti, estou procurando entender a ferramenta, alguém teria um modelo de formulário com esta rotina do cep para poder disponibilizar para que eu possa entender a mecnica do mesmo.
Fico agradecido caso seja atendido.
Amaury
Valeu pela contribuição Ricardo, ajudou bem.