2
respostas

[Projeto] Solução do Desafio

Olá, consegui realizar a solução do desafio.

Acho que consegui tratar todas as possíveis exceções (mais ou menos números digitados, caracteres diferentes de números e CEP não encontrado).

Gostaria de um feedback com críticas e sugestões, agradeço desde já!

Segue o código:

Classe ConversorJson

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

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

public class ConversorJson {

    public void converter(Endereco cep) throws IOException {

        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        FileWriter writer = new FileWriter(cep.cep());

        writer.write(gson.toJson(cep));
        writer.close();
    }
}

Classe Requisição:

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 Requisicao {

    //Será 'criado' um objeto do tipo Endereco, a partir do cep digitado
    public Endereco consultaEndereco(String cep) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        URI url = URI.create("https://viacep.com.br/ws/" + cep + "/json/");

        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder().uri(url).build();

        HttpResponse<String> response = null;
        try {
            response = client.send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException();
        }

//        String json = response.body();
//
//        Endereco endereco = gson.fromJson(json, Endereco.class);

//        return endereco;

        return gson.fromJson(response.body(), Endereco.class);  //peço para a biblioteca Gson 'transformar' o response.body
                                                                //de Json para um Endereco.

    }
}

Record Endereco:

public record Endereco(String cep, String logradouro, String bairro, String localidade, String uf) {

    @Override
    public String toString() {
        return "Cep: " + this.cep + "\n"+
                "Logradouro: " + this.logradouro + "\n" +
                "Bairro: " + this.bairro + "\n" +
                "Localidade: " + this.localidade + "\n" +
                "UF: " + this.uf;
    }
}

Classe Main:

import com.google.gson.JsonSyntaxException;

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

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

        Scanner sc = new Scanner(System.in);
        String cep = "";
        List<Endereco> lista = new ArrayList<>();

        while (!cep.equalsIgnoreCase("sair")) {
            try {
                System.out.println("Informe um cep para pesquisa:");
                cep = sc.nextLine();

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

                ConversorJson conversor = new ConversorJson();

                Requisicao requisicao = new Requisicao();
                conversor.converter(requisicao.consultaEndereco(cep));  //O metodo consultaEndereco() da classe Requisicao recebe o cep digitado e
                                                                        //retorna uma instancia de um objeto do tipo Endereco com atributos obtidos
            } catch (IOException e) {                                   //através da API ViaCep, que por sua vez é utilizado como paramentro do metodo
                throw new RuntimeException(e);                          //converter() da classe ConversorJson.
            } catch (NullPointerException e) {
                System.out.println("Não foi possível encontrar o CEP informado");
            } catch (JsonSyntaxException e) {
                System.out.println("O CEP informado está incorreto (deve possuir somente números e exatamente 8 dígitos)");
            }
        }

        System.out.println(lista);
    }
}
2 respostas

Olá Yuri, tudo bem?

Parabéns por ter conseguido realizar a solução do desafio! É sempre muito gratificante quando conseguimos concluir um projeto, não é mesmo?

Sobre o código que você postou, achei bem organizado e fácil de entender. Além disso, você conseguiu tratar as possíveis exceções que poderiam ocorrer, o que é muito importante para garantir que o programa não pare de funcionar caso algo inesperado aconteça.

A única sugestão que eu teria seria em relação à lista que você criou na classe Main. Você está adicionando os endereços consultados nessa lista, mas não está fazendo nada com ela no final do programa. Talvez você pudesse imprimir essa lista para que o usuário possa ver todos os endereços que foram consultados durante a execução do programa.

Espero ter ajudado e bons estudos!

Olá Matheus, obrigado pelo feedback.

Sim, concluir um desafio com sucesso é algo bem animador hahaha

Sobre a lista, eu esqueci de apagar somente hahaha