Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
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: ...
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:

  1. <?php
  2. public static function onBuscarCep($param null
  3.     {
  4.         try 
  5.         {
  6.             $endereco ConsultaCepService::getCep($param['cep'], 'json');
  7.             if( isset($endereco->erro) )
  8.             {
  9.                 throw new Exception($endereco->mensagem);
  10.             }
  11.             else
  12.             {                
  13.                 //prepara stdClass para preencher o formulario com o endereco retornado
  14.                 $object                     = new stdClass();
  15.                 $object->uf                 $endereco->uf;
  16.                 $object->cidade             $endereco->localidade;
  17.                 $object->bairro             $endereco->bairro;
  18.                 $object->logradouro          $endereco->logradouro;
  19.                 $object->complemento     $endereco->complemento;
  20.                 $object->numero             $endereco->unidade;
  21.                 
  22.                 //envia os dados para o formulario
  23.                 TForm::sendData(self::$formName$object);                            
  24.             }
  25.         }
  26.         catch (Exception $e
  27.         {
  28.             new TMessage('error'$e->getMessage());    
  29.         }
  30.     }
  31. ?>



Agora que vocês já podem chamar este serviço, segue a classe client webservice.
Sugiro salvá-la na pasta app/service

  1. <?php
  2. /**
  3.  * ConsultaCepService
  4.  *
  5.  * webservice cliente para buscar os dados do CEP, fornecidos pelo site www.viacep.com.br
  6.  * @package service
  7.  * @author Ricardo Câmara (camaramachado@gmail.com)
  8.  * @version 1.0
  9.  */
  10.  
  11. class ConsultaCepService
  12. {
  13.     
  14.     /**
  15.      * Method getCep
  16.      * Consulta o CEP utilizando o webservice do site www.viacep.com.br
  17.      * @param $cep string - CEP a ser consultado
  18.      * @param $formato string - formato da resposta. Suportados json, xml, piped ou querty.
  19.      * @return stdClass, XML, string (depende do formato) com os dados do CEP
  20.      * Se o CEP não possuir 8 digitos ou não existir, $stdClass->erro retorna TRUE e $stdClass->mensagem informa o erro.
  21.      * Exemplo de uso: $endereco = ConsultaCepService::getCep('99999999');
  22.      */
  23.     public static function getCep($cep$formato 'json')
  24.     {
  25.         try
  26.         {                                        
  27.             if( isset($cep) )
  28.             {
  29.                 //valida os formatos
  30.                 $formatos = ['json''xml''piped''querty'];
  31.                 if( !in_array($formato$formatos) )
  32.                 {
  33.                     $retorno             = new stdClass;
  34.                     $retorno->erro         TRUE;
  35.                     $retorno->mensagem     "Formato <b>{$formato}</b> não suportado!";
  36.                     return $retorno;
  37.                 }
  38.                 
  39.                 //pega apenas os numeros, retirando os demais caracteres
  40.                 $cep preg_replace("/[^0-9]/"""$cep);
  41.                 
  42.                 //o CEP deve ter 8 digitos
  43.                 if( strlen($cep) != )
  44.                 {
  45.                     $retorno             = new stdClass;
  46.                     $retorno->erro         TRUE;
  47.                     $retorno->mensagem     "CEP: <b>{$cep}</b> não possui 8 digitos!";    
  48.                     return $retorno;                                    
  49.                 }
  50.                 
  51.                 switch($formato)
  52.                 {
  53.                     case 'json':                        
  54.                         $retorno json_decodefile_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}") );
  55.                         break;
  56.                         
  57.                     case 'xml':                        
  58.                         $retorno htmlentities(file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}"));
  59.                         break;
  60.                 
  61.                     case 'piped':                        
  62.                         $retorno file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  63.                         break;
  64.                 
  65.                     case 'querty':                        
  66.                         $retorno file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  67.                         break;
  68.                 }
  69.                                                                                            
  70.                 //checa se o cep não existe, neste caso o atributo erro será TRUE
  71.                 if( isset($retorno->erro) )
  72.                 {
  73.                     $retorno->mensagem "CEP: <b>{$cep}</b> não existe na base de dados!";
  74.                 }
  75.                 
  76.                 return $retorno;
  77.             }
  78.         }
  79.         catch (Exception $e)
  80.         {
  81.             echo 'Error: ' $e->getMessage();
  82.         }
  83.     }
  84.     
  85. }
  86. /*
  87. *******************  FORMATO JSON  *******************  
  88. Retorno quando o CEP existe:
  89. stdClass Object
  90. (
  91.     [cep] => 51111-000
  92.     [logradouro] => Avenida Boa Viagem
  93.     [complemento] => de 1382/1383 a 2173/2174
  94.     [bairro] => Boa Viagem
  95.     [localidade] => Recife
  96.     [uf] => PE
  97.     [unidade] => 
  98.     [ibge] => 2611606
  99.     [gia] => 
  100. )
  101. Retorno quando o CEP não tem 8 digitos:
  102. stdClass Object
  103. (
  104.     [erro] => 1
  105.     [mensagem] => CEP: 5111100 não existe na base de dados!
  106. )
  107. Retorno quando o CEP não existe:
  108. stdClass Object
  109. (
  110.     [erro] => 1
  111.     [mensagem] => CEP: 99999999 não existe na base de dados!
  112. )
  113. Retorno se o formato não for suportado
  114. stdClass Object
  115. (
  116.     [erro] => 1
  117.     [mensagem] => Formato java não suportado!
  118. )
  119. */
  120. /*
  121. *******************  FORMATO XML  *******************  
  122. Retorno quando o CEP existe:
  123. <?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=
*/

?>

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (7)


F

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.
F

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>
FA

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
RC

Oi Fabrício Almeida,
também passei por este problema, para corrigir a classe ConsultaCepService por esta:


  1. <?php
  2. /**
  3.  * ConsultaCepService
  4.  *
  5.  * webservice cliente para buscar os dados do CEP, fornecidos pelo site www.viacep.com.br
  6.  * @package service
  7.  * @author Ricardo Câmara (camaramachado@gmail.com)
  8.  * @version 1.0
  9.  */
  10. class ConsultaCepService
  11. {
  12.     /**
  13.      * Method getCep
  14.      * Consulta o CEP utilizando o webservice do site www.viacep.com.br
  15.      * @param $cep string - CEP a ser consultado
  16.      * @param $formato string - formato da resposta. Suportados json, xml, piped ou querty.
  17.      * @return stdClass, XML, string (depende do formato) com os dados do CEP
  18.      * Se o CEP não possuir 8 digitos ou não existir, $stdClass->erro retorna TRUE e $stdClass->mensagem informa o erro.
  19.      * Exemplo de uso: $endereco = ConsultaCepService::getCep('99999999');
  20.      */
  21.     public static function getCep($cep$formato 'json')
  22.     {
  23.         session_write_close();
  24.         
  25.         try
  26.         {                                        
  27.             if( isset($cep) )
  28.             {
  29.                 //valida os formatos
  30.                 $formatos = ['json''xml''piped''querty'];
  31.                 if( !in_array($formato$formatos) )
  32.                 {
  33.                     $retorno             = new stdClass;
  34.                     $retorno->erro         TRUE;
  35.                     $retorno->mensagem     "Formato <b>{$formato}</b> não suportado!";
  36.                     return $retorno;
  37.                 }
  38.                 
  39.                 //pega apenas os numeros, retirando os demais caracteres
  40.                 $cep preg_replace("/[^0-9]/"""$cep);
  41.                 
  42.                 //o CEP deve ter 8 digitos
  43.                 if( strlen($cep) != )
  44.                 {
  45.                     $retorno             = new stdClass;
  46.                     $retorno->erro         TRUE;
  47.                     $retorno->mensagem     "CEP: <b>{$cep}</b> não possui 8 digitos!";    
  48.                     return $retorno;                                    
  49.                 }
  50.    
  51.                 switch($formato)
  52.                 {
  53.                     case 'json':
  54.                         $retorno json_decodefile_get_contents("http://viacep.com.br/ws/{$cep}/json/") ); 
  55.                         break;
  56.                         
  57.                     case 'xml':                        
  58.                         $retorno htmlentities(file_get_contents("http://viacep.com.br/ws/{$cep}/xml/"));
  59.                         break;
  60.                 
  61.                     case 'piped':                        
  62.                         $retorno file_get_contents("http://viacep.com.br/ws/{$cep}/piped/");
  63.                         break;
  64.                 
  65.                     case 'querty':                        
  66.                         $retorno file_get_contents("http://viacep.com.br/ws/{$cep}/querty/");
  67.                         break;
  68.                 }
  69.                                                                                            
  70.                 //checa se o cep não existe, neste caso o atributo erro será TRUE
  71.                 if( isset($retorno->erro) )
  72.                 {
  73.                     $retorno->mensagem "CEP: <b>{$cep}</b> não existe na base de dados!";
  74.                 }
  75.                 
  76.                 return $retorno;
  77.             }
  78.         }
  79.         catch (Exception $e)
  80.         {
  81.             echo 'Error: ' $e->getMessage();
  82.         }
  83.     }
  84.     
  85. }
  86. /*
  87. *******************  FORMATO JSON  *******************  
  88. Retorno quando o CEP existe:
  89. stdClass Object
  90. (
  91.     [cep] => 51111-000
  92.     [logradouro] => Avenida Boa Viagem
  93.     [complemento] => de 1382/1383 a 2173/2174
  94.     [bairro] => Boa Viagem
  95.     [localidade] => Recife
  96.     [uf] => PE
  97.     [unidade] => 
  98.     [ibge] => 2611606
  99.     [gia] => 
  100. )
  101. Retorno quando o CEP não tem 8 digitos:
  102. stdClass Object
  103. (
  104.     [erro] => 1
  105.     [mensagem] => CEP: 5111100 não existe na base de dados!
  106. )
  107. Retorno quando o CEP não existe:
  108. stdClass Object
  109. (
  110.     [erro] => 1
  111.     [mensagem] => CEP: 99999999 não existe na base de dados!
  112. )
  113. Retorno se o formato não for suportado
  114. stdClass Object
  115. (
  116.     [erro] => 1
  117.     [mensagem] => Formato java não suportado!
  118. )
  119. */
  120. /*
  121. *******************  FORMATO XML  *******************  
  122. Retorno quando o CEP existe:
  123. <?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:
*/


FA

Oi Ricardo Câmara,
Muito obrigado!
AV

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
AV

Valeu pela contribuição Ricardo, ajudou bem.