Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] DESAFIO

PRINCIPAL

package br.com.buscacep.principal;

import br.com.buscacep.modelos.Endereco;
import br.com.buscacep.servicos.BuscaCep;

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

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

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

        Scanner leitura = new Scanner(System.in);
        System.out.println("Digite o CEP:");
        String cep = leitura.nextLine();

        BuscaCep busca = new BuscaCep();
        Endereco endereco = busca.buscar(cep);

        System.out.println(endereco);

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

        try {
            FileWriter escrita = new FileWriter("endereco.json");
            escrita.write(gson.toJson(endereco));
            escrita.close();

            System.out.println("Arquivo JSON gerado!");
        } catch (IOException e) {
            System.out.println("Erro ao salvar arquivo.");
        }

        System.out.println("Finalizado com sucesso! ");

    }
}

ENDEREÇO

package br.com.buscacep.modelos;

public class Endereco {
    public String cep;
    private String logradouro;
    private String bairro;
    private String localidade;
    private String uf;

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCep() {
        return cep;
    }

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

    public String getLocalidade() {
        return localidade;
    }

    public void setLocalidade(String localidade) {
        this.localidade = localidade;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    @Override
    public String toString() {
        return "CEP: " + cep +
                "\nRua: " + logradouro +
                "\nBairro: " + bairro +
                "\nCidade: " + localidade +
                "\nEstado: " + uf;

    }
}

BUSCAR CEP

package br.com.buscacep.servicos;

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

import com.google.gson.Gson;
import br.com.buscacep.modelos.Endereco;

public class BuscaCep {


    public Endereco buscar(String cep) {
        URI endereco = URI.create(("https://viacep.com.br/ws/" + cep + "/json/"));

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(endereco)
                .build();

        try {
            HttpResponse<String> response = HttpClient
                    .newHttpClient()
                    .send(request, HttpResponse.BodyHandlers.ofString());

            Gson gson = new Gson();
            return gson.fromJson(response.body(), Endereco.class);

        } catch (IOException | InterruptedException e) {
            throw new RuntimeException("Erro ao buscar CEP");
        }
    }
}
2 respostas
solução!

Oi, Giulia!

Parabéns por concluir esse desafio. É gratificante ver o projeto funcionando de ponta a ponta, desde a consulta à API até a geração do arquivo.

O seu código tá bem estruturado e você aplicou corretamente a separação de classes por responsabilidade. Notei que você utilizou o HttpClient e o Gson de forma integrada para converter o JSON da ViaCep em um objeto Endereco, o que é uma excelente prática.

Abaixo, deixo algumas sugestões para tornar seu projeto ainda mais alinhado com o que foi discutido na aula:

Organização e tratamento de erros

  • Encapsulamento do gerador: No seu código atual, a lógica de criação do arquivo tá dentro da classe Principal. Pra seguir o princípio de responsabilidade única, você pode mover esse bloco para uma classe específica, como GeradorDeArquivo, conforme sugerido na atividade.
  • Tratamento de exceções: Ao colocar a chamada de busca.buscar(cep) dentro do bloco try-catch, você garante que a aplicação não quebre caso o usuário digite um CEP inválido, permitindo exibir uma mensagem amigável antes de encerrar.
  • Nomeação de arquivos: Uma ideia interessante é nomear o arquivo JSON com o próprio número do CEP (ex: 01001000.json), facilitando a identificação dos arquivos gerados.

Pra aprofundar seus estudos sobre como organizar melhor a escrita de arquivos e evitar esquecer de fechar recursos, recomendo pesquisar sobre o Try-with-resources do Java.

Você conseguiu notar alguma diferença na organização do projeto ao separar a busca do endereço da lógica de exibição no console?

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

Olá, Lorena!!
Muito obrigada pelas dicas. Realmente faz mais sentido!
Vou fazer novamente para testar!!
Abraço