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.