É através do CEP que podemos encontrar dados relacionados a um endereço, assim podemos preencher os demais campos automaticamente sem que o usuário preencha manualmente. Antes de prosseguirmos, precisamos entender de fato o que é um CEP e porque ele existe.
“O Código de Endereçamento Postal é um conjunto numérico constituído de oito algarismos, cujo objetivo principal é orientar e acelerar o encaminhamento, o tratamento e a distribuição de objetos de correspondência, por meio da sua atribuição a localidades, logradouros, unidades dos Correios, serviços, órgãos públicos, empresas e edifícios.” (Acesso em 24/02/2018 https://www.correios.com.br/para-voce/precisa-de-ajuda/o-que-e-cep-e-por-que-usa-lo).
Normalmente para preencher os dados do formulário com base nos números do CEP informado, utilizamos o Javascript para fazer uma requisição via AJAX e retornar os dados, para posteriormente preencher os campos.
Existem diversos serviços que disponibilizam API para integração, aqui vamos usar o site viacep.com, porém é muito importante que o desenvolvedor fique atento e estes serviços, pois eles podem parar de funcionar, e se isso acontecer, a aplicação tem que continuar funcionando sem ter erros que comprometam os formulários.
Vamos há um exemplo de como obter os dados de um CEP e retornar em uma string JSON, posteriormente convertermos este JSON em um array.
Para retornar os dados, basta fazer uma chamada através de uma URL passando o CEP sem o ‘–‘.
Exemplo de utilização: https://viacep.com.br/ws/123456000/json/
Para executar o código abaixo, é só acessara URL do script e passar uma query string com o CEP, da seguinte forma localhost/cep.php?cep=03009000.
Código 01:
$cep = filter_input(INPUT_GET, "cep");
if($cep){
$cep = str_replace("-", "", $cep);
$json = file_get_contents('https://viacep.com.br/ws/'. $cep . '/json/');
$jsonToArray = json_decode($json);
?-->
<p>CEP: <?=$jsonToArray->cep;?></p>
<p>LOGRADOURO: <?=$jsonToArray->logradouro;?></p>
<p>COMPLEMENTO: <?=$jsonToArray->complemento;?></p>
<p>BAIRRO: <?=$jsonToArray->bairro;?></p>
<p>LOCALIDADE: <?=$jsonToArray->localidade;?></p>
<p>UF: <?=$jsonToArray->uf;?></p>
<p>UNIDADE: <?=$jsonToArray->unidade;?></p>
<p>IBGE: <?=$jsonToArray->ibge;?></p>
<p>GIA: <?=$jsonToArray->gia;?></p>
<?php
}
Agora vamos utilizar uma outra API para testes, essa API é interna do SatellaSoft é possui apenas 5 CEP cadastrado, ela deve ser utilizada apenas para testes, até porque não tem nenhuma utilidade com uma quantidade baixa de informações.
Exemplo de utilização: http://satellasoft.com/servicos/buscacep/?cep=123456000. Porém para utilizar o serviço de API de testes, é necessário que sua aplicação esteja rodando em um servidor WEB e não em servidor local.
Os CEPs disponíveis são:
CEP 01: 19050690 - Presidente Prudente
CEP 02: 01001000 - São Paulo
CEP 03: 69921126 - Acre
CEP 04: 13940000 - Águas e Lindóia/SP
CEP 05: 19640000 - Iepê/SP
Veja no algoritmo abaixo como fazer a requisição.
Código 02:
$cep = filter_input(INPUT_GET, "cep");
if($cep){
$cep = str_replace("-", "", $cep);
$json = file_get_contents('http://localhost/buscacep/?cep='. $cep);
$jsonToArray = json_decode($json);
?-->
<p>CEP: <?=$jsonToArray->cep;?></p>
<p>LOGRADOURO: <?=$jsonToArray->logradouro;?></p>
<p>COMPLEMENTO: <?=$jsonToArray->complemento;?></p>
<p>BAIRRO: <?=$jsonToArray->bairro;?></p>
<p>LOCALIDADE: <?=$jsonToArray->localidade;?></p>
<p>UF: <?=$jsonToArray->uf;?></p>
<p>UNIDADE: <?=$jsonToArray->unidade;?></p>
<p>IBGE: <?=$jsonToArray->ibge;?></p>
<p>GIA: <?=$jsonToArray->gia;?></p>
<?php
}
Caso você não tenha um servidor WEB para testar, você pode criar a API de testes, basta criar um script com os códigos abaixo e fazer a chamada a partir dele, mas respeite as limitaçãos dos CEPs disponíveis, como se trata de uma API de testes, não use em ambiente de produção. A URL de testes, foi criada apenas para exemplificar esse artigo.
Código 03:
<?php
header('Content-Type: application/json; charset=utf-8');
$req = filter_input(INPUT_GET, "cep", FILTER_SANITIZE_NUMBER_INT);
if($req){
$req = str_replace("-", "", $req);
$cepdata = array();
switch($req){
case '19050690':
$cepdata = array(
"cep" => "19050-690",
"logradouro" => "Rua Democrata",
"complemento" => "",
"bairro"=> "Jardim Bongiovani",
"localidade" => "Presidente Prudente",
"uf" => "SP",
"unidade" => "",
"ibge" => "3541406",
"gia" => "5629"
);
break;
case '01001000':
$cepdata = array(
"cep" => "01001-000",
"logradouro" => "Praça da Sé",
"complemento" => "lado ímpar",
"bairro" => "Sé",
"localidade" => "São Paulo",
"uf" => "SP",
"unidade" => "",
"ibge" => "3550308",
"gia" => "1004"
);
break;
case '69921126':
$cepdata = array(
"cep" => "69921-126",
"logradouro" => "Rua Angelim",
"complemento" => "",
"bairro" => "Loteamento Novo Horizonte",
"localidade" => "Rio Branco",
"uf" => "AC",
"unidade" => "",
"ibge" => "1200401",
"gia" => ""
);
break;
case '13940000':
$cepdata = array(
"cep" => "13940-000",
"logradouro" => "",
"complemento" => "",
"bairro" => "",
"localidade" => "Águas de Lindóia",
"uf" => "SP",
"unidade" => "",
"ibge" => "3500501",
"gia" => "1533"
);
break;
case '19640000':
$cepdata = array(
"cep" => "19640-000",
"logradouro" => "",
"complemento" => "",
"bairro" => "",
"localidade" => "Iepê",
"uf" => "SP",
"unidade" => "",
"ibge" => "3519907",
"gia" => "3475"
);
break;
}
echo json_encode($cepdata);
}else{
echo "invalid";
}
?>
Por hora é apenas isso, eu vou ficando por aqui e nos vemos na próxima oportunidade.
Correios: https://www.correios.com.br/para-voce/precisa-de-ajuda/o-que-e-cep-e-por-que-usa-lo
Manual PHP: http://php.net/manual/pt_BR/function.file-get-contents.php