Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

1
resposta

[Projeto] Exemplo de buscador de CEP

Compartilhando um pouco do meu codigo, modularizei um pouco diferente para ficar mais organizado em relação ao que fizemos no projeto ScreenMatch

Na minha classe dadosCEP eu quis testar um pouco os possiveis erros que teria e por isso decidi implementar todos os campos do response da API. Um exemplo é que se eu determinar IBGE ou DDD como Integer, me retorna um exception pois pode ser que tenha dados que não são numeros ou diferentes de inteiro, então alterei ambos para String

package br.com.alura.buscaCEP.modelos;

public record dadosCEP(String cep,
                       String logradouro,
                       String complemento,
                       String unidade,
                       String bairro,
                       String localidade,
                       String uf,
                       String estado,
                       String regiao,
                       String ibge,
                       String gia,
                       String ddd,
                       String siafi) {
}

Criei uma classe que absorve o request da API usando o HttpRequest, porém diferente do que foi explicado em aula, eu tratei exception try/catch de uma forma diferente, no meu caso, quando for erro de cep invalido, a API retorna como erro: true do tipo booleano, e para isto criei uma condição que valida e me retorna uma mensagem

package br.com.alura.buscaCEP.repositorio;

import br.com.alura.buscaCEP.excecao.erroCepInvalido;
import br.com.alura.buscaCEP.modelos.dadosCEP;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class RepositorioAPI {
    public dadosCEP buscarCEP(String cep) throws IOException, InterruptedException {
        String endereco = "https://viacep.com.br/ws/" + cep + "/json/";

        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(endereco))
                    .build();
            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println(response.body());

            String json = response.body();
            System.out.println("Resposta da API: " + json);

            Gson gson = new GsonBuilder()
                    //setPrettyPrinting formata a impressao do arquivo criado
                    .setPrettyPrinting()
                    .create();

            dadosCEP dados = gson.fromJson(json, dadosCEP.class);
            if (json.contains("\"erro\": true") || json.contains("\"erro\": \"true\"")) {
                throw new erroCepInvalido("CEP inválido ou não encontrado: " + cep);
            }

            return dados;

        }catch (IOException | InterruptedException e){
            throw new RuntimeException("Erro ao buscar o CEP: " + e.getMessage(), e);
        }
    }
}

E me baseando na ideia do ScreenMatch, criei uma classe de para tratar o erro de cep invalido extendendo do tipo RunTimeException

package br.com.alura.buscaCEP.excecao;

public class erroCepInvalido extends RuntimeException {
        private String mensagem;

        public erroCepInvalido(String mensagem) {
            super(mensagem);
        }

        public String getMensagem() {
            return mensagem;
        }
}

Por fim criei as duas classes principais, a primeira para digitar o cep e buscar na API

package br.com.alura.buscaCEP.principal;

import br.com.alura.buscaCEP.excecao.erroCepInvalido;
import br.com.alura.buscaCEP.modelos.dadosCEP;
import br.com.alura.buscaCEP.repositorio.RepositorioAPI;
import br.com.alura.buscaCEP.repositorio.gerarJSON;

import java.io.IOException;
import java.util.Scanner;

public class PrincipalComBusca {
public static void main(String[] args) throws IOException, InterruptedException {
    Scanner leitura = new Scanner(System.in);

    System.out.println("Digite um CEP para pesquisa: ");
    String cep = leitura.nextLine();

    RepositorioAPI cepDigitado = new RepositorioAPI();
    dadosCEP dados = null;
    try {
        dados = cepDigitado.buscarCEP(cep);
        System.out.println(dados);
    } catch (erroCepInvalido e) {
        System.out.println(e.getMessage());
    }
    gerarJSON gerador = new gerarJSON();
    gerador.salvarDados(dados);

    System.out.println("Programa finalizado!");

}
}

e com o retorno da API eu indico a criação de um arquivo .json na classe gerarJSON (não consegui colocar o codigo da classe, ultrapassou o limite de caracteres)

    String nomeArquivo = dados.cep() + ".json";
    FileWriter escrita = new FileWriter(nomeArquivo);

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Oi, Caio! Como vai?

Com o que você descreveu, sua organização ficou clara e a forma como tratou os campos variáveis da API mostrou atenção aos detalhes. A validação do "erro": true também ficou bem direta, mantendo o fluxo simples.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!