Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Desafio cep

package br.com.nadson.modelo;



public record Endereco(String cep, String logradouro, String complemento, String bairro, String localidade, String uf) {
    @Override
    public String toString() {
        return String.format(
                "CEP: %s, Logradouro: %s, Complemento: %s, Bairro: %s, Cidade: %s, UF: %s",
                cep, logradouro, complemento, bairro, localidade, uf
        );
    }
}
package br.com.nadson.excessao;

public class CepInvalidoException extends RuntimeException {
    public CepInvalidoException(String s) {
        super(s);
    }
}
package br.com.nadson.modelo;

import br.com.nadson.excessao.CepInvalidoException;
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 ApiCep {

    private String cep;
    private final HttpClient client = HttpClient.newHttpClient();

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String consultar() {
        validarCep();

        String endereco = "https://viacep.com.br/ws/" + cep + "/json/";

        try {
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(endereco))
                    .GET()
                    .build();

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

            if (response.statusCode() == 400) {
                throw new CepInvalidoException("CEP inválido: " + cep);
            }

            return response.body();

        } catch (IOException | InterruptedException e) {
            throw new RuntimeException("Falha ao consultar API: " + e.getMessage());
        }
    }

    private void validarCep() {
        if (cep == null || cep.isBlank()) {
            throw new CepInvalidoException("CEP não informado.");
        }

        if (!cep.matches("\\d{8}")) {
            throw new CepInvalidoException("CEP deve conter exatamente 8 números.");
        }
    }
}
package br.com.nadson.principal;

import br.com.nadson.excessao.CepInvalidoException;
import br.com.nadson.modelo.ApiCep;
import br.com.nadson.modelo.Endereco;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Principal {
    public static void main(String[] args) {

        Scanner entrada = new Scanner(System.in);
        ApiCep api = new ApiCep();
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        List<Endereco> enderecos = new ArrayList<>();

        try (FileWriter escrita = new FileWriter("enderecos.json")) {

            while (true) {
                System.out.println("Digite um CEP (ou 'sair' para terminar): ");
                String cepDigitado = entrada.nextLine().trim();

                if (cepDigitado.equalsIgnoreCase("sair")) {
                    break;
                }

                try {
                    api.setCep(cepDigitado);
                    String json = api.consultar();

                    if (json.contains("\"erro\": true")) {
                        throw new CepInvalidoException("CEP não encontrado: " + cepDigitado);
                    }

                    Endereco endereco = gson.fromJson(json, Endereco.class);
                    enderecos.add(endereco);

                    System.out.println("Endereço adicionado!");

                } catch (CepInvalidoException e) {
                    System.out.println("Erro: " + e.getMessage());
                } catch (RuntimeException e) {
                    System.out.println("Falha ao consultar API: " + e.getMessage());
                }
            }

            escrita.write(gson.toJson(enderecos));

            System.out.println("Arquivo salvo com sucesso.");

        } catch (IOException e) {
            System.out.println("Erro ao criar arquivo: " + e.getMessage());
        }

        System.out.println("Programa finalizado.");
    }
}
1 resposta
solução!

Olá, Nadson! Tudo bem?

Excelente implementação do desafio de consumo de API!

Seu código está muito bem estruturado e demonstra maturidade técnica. Gostei especialmente de você ter tratado o retorno "erro": true da ViaCEP no Principal. Muita gente esquece que essa API retorna status 200 mesmo quando o CEP não existe (mas é válido), e sua lógica capturou isso perfeitamente.

Bons estudos!

Sucesso

Imagem da comunidade