Conheça as melhorias da versão 8.0, 8.1, 8.2!
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. //envia os dados para o formulario
  22. TForm::sendData(self::$formName, $object);
  23. }
  24. }
  25. catch (Exception $e)
  26. {
  27. new TMessage('error', $e->getMessage());
  28. }
  29. }
  30. ?>



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. 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. try
  24. {
  25. if( isset($cep) )
  26. {
  27. //valida os formatos
  28. $formatos = ['json', 'xml', 'piped', 'querty'];
  29. if( !in_array($formato, $formatos) )
  30. {
  31. $retorno = new stdClass;
  32. $retorno->erro = TRUE;
  33. $retorno->mensagem = "Formato <b>{$formato}</b> não suportado!";
  34. return $retorno;
  35. }
  36. //pega apenas os numeros, retirando os demais caracteres
  37. $cep = preg_replace("/[^0-9]/", "", $cep);
  38. //o CEP deve ter 8 digitos
  39. if( strlen($cep) != 8 )
  40. {
  41. $retorno = new stdClass;
  42. $retorno->erro = TRUE;
  43. $retorno->mensagem = "CEP: <b>{$cep}</b> não possui 8 digitos!";
  44. return $retorno;
  45. }
  46. switch($formato)
  47. {
  48. case 'json':
  49. $retorno = json_decode( file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}") );
  50. break;
  51. case 'xml':
  52. $retorno = htmlentities(file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}"));
  53. break;
  54. case 'piped':
  55. $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  56. break;
  57. case 'querty':
  58. $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  59. break;
  60. }
  61. //checa se o cep não existe, neste caso o atributo erro será TRUE
  62. if( isset($retorno->erro) )
  63. {
  64. $retorno->mensagem = "CEP: <b>{$cep}</b> não existe na base de dados!";
  65. }
  66. return $retorno;
  67. }
  68. }
  69. catch (Exception $e)
  70. {
  71. echo 'Error: ' . $e->getMessage();
  72. }
  73. }
  74. }
  75. /*
  76. ******************* FORMATO JSON *******************
  77. Retorno quando o CEP existe:
  78. stdClass Object
  79. (
  80. [cep] => 51111-000
  81. [logradouro] => Avenida Boa Viagem
  82. [complemento] => de 1382/1383 a 2173/2174
  83. [bairro] => Boa Viagem
  84. [localidade] => Recife
  85. [uf] => PE
  86. [unidade] =>
  87. [ibge] => 2611606
  88. [gia] =>
  89. )
  90. Retorno quando o CEP não tem 8 digitos:
  91. stdClass Object
  92. (
  93. [erro] => 1
  94. [mensagem] => CEP: 5111100 não existe na base de dados!
  95. )
  96. Retorno quando o CEP não existe:
  97. stdClass Object
  98. (
  99. [erro] => 1
  100. [mensagem] => CEP: 99999999 não existe na base de dados!
  101. )
  102. Retorno se o formato não for suportado
  103. stdClass Object
  104. (
  105. [erro] => 1
  106. [mensagem] => Formato java não suportado!
  107. )
  108. */
  109. /*
  110. ******************* FORMATO XML *******************
  111. Retorno quando o CEP existe:
  112. <?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 Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework 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. try
  25. {
  26. if( isset($cep) )
  27. {
  28. //valida os formatos
  29. $formatos = ['json', 'xml', 'piped', 'querty'];
  30. if( !in_array($formato, $formatos) )
  31. {
  32. $retorno = new stdClass;
  33. $retorno->erro = TRUE;
  34. $retorno->mensagem = "Formato <b>{$formato}</b> não suportado!";
  35. return $retorno;
  36. }
  37. //pega apenas os numeros, retirando os demais caracteres
  38. $cep = preg_replace("/[^0-9]/", "", $cep);
  39. //o CEP deve ter 8 digitos
  40. if( strlen($cep) != 8 )
  41. {
  42. $retorno = new stdClass;
  43. $retorno->erro = TRUE;
  44. $retorno->mensagem = "CEP: <b>{$cep}</b> não possui 8 digitos!";
  45. return $retorno;
  46. }
  47. switch($formato)
  48. {
  49. case 'json':
  50. $retorno = json_decode( file_get_contents("http://viacep.com.br/ws/{$cep}/json/") );
  51. break;
  52. case 'xml':
  53. $retorno = htmlentities(file_get_contents("http://viacep.com.br/ws/{$cep}/xml/"));
  54. break;
  55. case 'piped':
  56. $retorno = file_get_contents("http://viacep.com.br/ws/{$cep}/piped/");
  57. break;
  58. case 'querty':
  59. $retorno = file_get_contents("http://viacep.com.br/ws/{$cep}/querty/");
  60. break;
  61. }
  62. //checa se o cep não existe, neste caso o atributo erro será TRUE
  63. if( isset($retorno->erro) )
  64. {
  65. $retorno->mensagem = "CEP: <b>{$cep}</b> não existe na base de dados!";
  66. }
  67. return $retorno;
  68. }
  69. }
  70. catch (Exception $e)
  71. {
  72. echo 'Error: ' . $e->getMessage();
  73. }
  74. }
  75. }
  76. /*
  77. ******************* FORMATO JSON *******************
  78. Retorno quando o CEP existe:
  79. stdClass Object
  80. (
  81. [cep] => 51111-000
  82. [logradouro] => Avenida Boa Viagem
  83. [complemento] => de 1382/1383 a 2173/2174
  84. [bairro] => Boa Viagem
  85. [localidade] => Recife
  86. [uf] => PE
  87. [unidade] =>
  88. [ibge] => 2611606
  89. [gia] =>
  90. )
  91. Retorno quando o CEP não tem 8 digitos:
  92. stdClass Object
  93. (
  94. [erro] => 1
  95. [mensagem] => CEP: 5111100 não existe na base de dados!
  96. )
  97. Retorno quando o CEP não existe:
  98. stdClass Object
  99. (
  100. [erro] => 1
  101. [mensagem] => CEP: 99999999 não existe na base de dados!
  102. )
  103. Retorno se o formato não for suportado
  104. stdClass Object
  105. (
  106. [erro] => 1
  107. [mensagem] => Formato java não suportado!
  108. )
  109. */
  110. /*
  111. ******************* FORMATO XML *******************
  112. Retorno quando o CEP existe:
  113. <?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.