Buscando endereço através de CEP com PHP

Veja como é simples encontrar dados de um determinado endereço através do CEP.

PHP Moderno: Criando uma aplicação com área administrativa

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