1
resposta

Resolução do Desafio - Capitulo-05

Classe Principal: ConsultaCep.java

package br.com.alura.screenmatch.principal;
import br.com.alura.screenmatch.servicos.ConsultarCep;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        try {
            System.out.println("Informe o número de cep:");
            String cep = leitura.nextLine();

            ConsultaCep.consultaCep(cep);

        } catch (RuntimeException e) {
            System.out.println(e.getMessage());
            System.out.println("Finalizado o programa!");
        }
    }
}

#### Classe ConsultaCep: `ConsultaCep.java`

```java
package br.com.alura.screenmatch.servicos;
import br.com.alura.screenmatch.modelos.Endereco;
import br.com.alura.screenmatch.utils.ValidaCepConsultado;
import com.google.gson.Gson;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ConsultaCep {

    public static void consultaCep(String numeroDoCep) {
        String cepValidado = ValidaCepConsultado.validar(numeroDoCep);

        if (cepValidado == null) {
            System.out.println("CEP inválido. Informe no formato 00000000 ou 00000-000.");
            return;
        }

        try {
            String url = "https://viacep.com.br/ws/" + cepValidado + "/json/";
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .GET()
                    .build();

            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            if (response.statusCode() == 200) {
                String json = response.body();
                Gson gson = new Gson();
                Endereco endereco = gson.fromJson(json, Endereco.class);

                if (Boolean.TRUE.equals(endereco.erro())) {
                    System.out.println("CEP não encontrado.");
                } else {
                    System.out.println(endereco.toString());

                    // salvar os dados obitidos num arquivo endereço
                    GeradorDeArquivo gerador = new GeradorDeArquivo();
                    gerador.salvaJson(endereco);
                }
            } else {
                System.err.println("Erro na requisição. Código de status: " + response.statusCode());
            }

        } catch (Exception e) {
            System.err.println("Aconteceu um erro ao consultar o CEP: " + e.getMessage());
        }
    }
}

#### Classe ValidaCepConsultado: `validação e limpeza do CEP`

```java
package br.com.alura.screenmatch.utils;


public class ValidaCepConsultado {

    public static String validar(String cepDigitado) {
        String cepLimpo = cepDigitado.replaceAll("[^0-9]", "");

        if (!cepLimpo.matches("\\d{8}")) {
            return null;
        }

        return cepLimpo;
    }
}

#### Classe GeradorDeArquivo: `salvando os dados do endereço`

```java
package br.com.alura.screenmatch.servicos;

import br.com.alura.screenmatch.modelos.Endereco;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;

public class GeradorDeArquivo {
    public void salvaJson(Endereco endereco) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String pasta = "enderecos_salvos";
        String caminhoArquivo = pasta + "/" + endereco.cep() + ".json";

        try (FileWriter escrita = new FileWriter(caminhoArquivo)) {
            gson.toJson(endereco, escrita);
            System.out.println("Endereço salvo no arquivo endereco.json.");
        } catch (IOException e) {
            System.err.println("Erro ao salvar o arquivo JSON: " + e.getMessage());
        }

    }
}

#### Classe Endereco: `representação dos dados retornados pelo ViaCEP`

```java
package br.com.alura.screenmatch.modelos;

public record Endereco(
        String cep,
        String logradouro,
        String complemento,
        String bairro,
        String localidade,
        String uf,
        String ibge,
        String gia,
        String ddd,
        String siafi,
        Boolean erro // pode ser null se não existir
) {
    @Override
    public String toString() {
        return """
               CEP: %s
               Logradouro: %s
               Complemento: %s
               Bairro: %s
               Cidade: %s
               UF: %s
               """.formatted(cep, logradouro, complemento, bairro, localidade, uf);
    }
}
1 resposta

Olá, Bruno! Como vai?

Muito bem! Continue resolvendo os desafios e compartilhando com a comunidade Alura.

Observei que você explorou o uso de requisições HTTP com HttpClient para consumir uma API externa, utilizou muito bem o Gson para converter JSON em objetos Java e ainda compreendeu a importância do tratamento de erros com try-catch para garantir uma experiência mais robusta ao usuário.

Uma dica interessante para o futuro é usar um bloco finally para garantir o fechamento de recursos ou exibir mensagens finais, independentemente do sucesso ou falha da execução. Dessa forma:

try {
    // lógica principal
} catch (Exception e) {
    System.out.println("Erro: " + e.getMessage());
} finally {
    System.out.println("Programa encerrado.");
}

Resultado:

Erro: <mensagem do erro>
Programa encerrado.

Isso faz com que uma mensagem final seja sempre exibida, mesmo que ocorra um erro no processo.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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