1
resposta

Projeto final do curso - consultar a API ViaCEP

Classe da API

package com.vn.challenge3;

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 Request {
    public String getJson(String address) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(address))
                .build();
        HttpResponse<String> response = client
                .send(request, HttpResponse.BodyHandlers.ofString());

        return response.body();
    }
}

Main

package com.vn.challenge3;
import com.google.gson.*;

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

public class Scep extends Request {
    static void main(String[] args) throws IOException, InterruptedException {
        Scep search = new Scep();
        Scanner sc = new Scanner(System.in);
        ArrayList<JsonObject> addresses = new ArrayList<>();
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();

        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                if (addresses.isEmpty()) {
                    System.out.println("No addresses to save!");
                    return;
                }
                System.out.println("Running Shutdown Hook");
                try (FileWriter writer = new FileWriter("Ceps.json")) {
                    writer.write(gson.toJson(addresses));
                    System.out.println("File updated!");
                } catch (IOException e) {
                    System.out.println("Error to save file: " + e.getMessage());
                }
            }
        });

        while(true) {
            System.out.println("""
                    **** Ceps Consultation ****
                    Enter your cep:
                    """);
            String cep = sc.nextLine().replace("-", "");

            if (cep.equalsIgnoreCase("Close")){
                if (addresses.isEmpty()) {
                    System.out.println("The field cannot be empty! try again: ");
                    continue;
                }
                break;
            }
            if (cep.equalsIgnoreCase("list")) {
                if (addresses.isEmpty()) {
                    System.out.println("No addresses consulted yet!");
                } else {
                    addresses.forEach(a -> System.out.println(
                            a.get("cep").getAsString() + " - " + a.get("logradouro").getAsString()
                    ));
                }
                continue;
            }
            if (!cep.matches("\\d{8}")) {
                System.out.println("Invalidated Cep! Enter exactly 8 numeric digits. ");
                continue;
            }
            try {
                String address = search.getJson("https://viacep.com.br/ws/" + cep + "/json/");
                JsonObject json = JsonParser.parseString(address).getAsJsonObject();
                if (json.has("erro")) {
                    System.out.println("CEP not found! Enter again: ");
                    continue;
                }
                System.out.println(address);
                boolean duplicated = addresses.stream()
                        .anyMatch(a -> a.get("cep").getAsString().equals(json.get("cep").getAsString()));
                if (duplicated) {
                    System.out.println("CEP already registered!");
                    continue;
                }
                addresses.add(json);
            } catch (Exception e) {
                System.out.println("Connection error! Try again: ");
            }
        }
        sc.close();
    }
}
1 resposta

Oi, Vinicius. Como vai?

Você organizou bem a consulta da API em uma classe separada e também o cuidado com a validação do CEP, a verificação de duplicidade com stream() e o uso do ShutdownHook para salvar os dados no arquivo ao encerrar o programa. Isso mostra uma boa preocupação com organização, reaproveitamento de código e tratamento de fluxo da aplicação.

Uma dica interessante para o futuro é usar o método statusCode() da resposta para validar melhor a requisição antes de processar o JSON. Veja este exemplo:


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

if (response.statusCode() == 200) {
    System.out.println(response.body());
} else {
    System.out.println("erro na requisicao");
}

Esse código verifica se a resposta retornou com sucesso antes de exibir o conteúdo, deixando o tratamento mais claro e seguro.

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