Lançado Adianti Framework 7.6!
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.