1
resposta

[Projeto Final] - API para consumo de CEP

Fala galera, tudo bem?

Só compartilhando aqui como ficou meu projeto final (consumindo API de CEPs):

  • Classe para requisição HTTP e montagem do meu objeto:
package br.com.alura.cepbrowserfinal.apis;

import br.com.alura.cepbrowserfinal.excecoes.CepInvalidoException;
import br.com.alura.cepbrowserfinal.modelos.Endereco;
import com.google.gson.Gson;

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 Http {
    private String urlCep = "https://viacep.com.br/ws/";
    private Endereco meuEndereco;

    public Http (String cep) throws IOException, InterruptedException  {

        urlCep += cep + "/json";

        HttpClient client = HttpClient.newHttpClient();

        try {

            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(urlCep))
                    .build();
            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

            //vou gerar uma exceção se der erro 400 - CEP inválido
            if (response.statusCode() == 400) {
                throw new CepInvalidoException("Cep inválido!");
            }
            System.out.println("\nDados brutos: ");
            System.out.println(response.body());

            System.out.println("\nDados a serem guardados: ");

            Gson gson = new Gson();
            meuEndereco = gson.fromJson(response.body(),Endereco.class);
            System.out.println(meuEndereco);

        } catch (CepInvalidoException c) {
            System.out.println(c.getMessage());
        } catch (Exception e) {
            System.out.println("\nAconteceu um problema");
        }
    }

    public Endereco getMeuEndereco() {
        return meuEndereco;
    }
}
  • Classe da Exceção criada:
package br.com.alura.cepbrowserfinal.excecoes;

public class CepInvalidoException extends RuntimeException {
    private String mensagem;
    public CepInvalidoException(String mensagem) {
        this.mensagem = mensagem;
    }

    @Override
    public String getMessage() {
        return this.mensagem;
    }
}
  • Classe para gerar o JSON:
package br.com.alura.cepbrowserfinal.apis;

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

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

public class GeradorJson {
    public GeradorJson (Endereco meuEndereco) throws IOException {
        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();
        FileWriter cepJsonFinal = new FileWriter("cepJsonFinal.json");
        cepJsonFinal.write(gson.toJson(meuEndereco));
        cepJsonFinal.close();
    }
}
  • Record para mapeamento dos dados:
package br.com.alura.cepbrowserfinal.modelos;

public record Endereco(String cep, String logradouro, String complemento, String bairro, String localidade, String uf) {
}
  • Classe principal:
package br.com.alura.cepbrowserfinal.principal;

import br.com.alura.cepbrowserfinal.apis.GeradorJson;
import br.com.alura.cepbrowserfinal.apis.Http;
import br.com.alura.cepbrowserfinal.modelos.Endereco;

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

public class Principal {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner sc = new Scanner(System.in);

        System.out.print("Digite um CEP para busca (somente números): ");
        String cep = sc.nextLine();
        
        Http requisicaoHttp = new Http(cep.replace(" ","").replace(".","").replace("-","").replace("_",""));

        System.out.println("\nOs dados foram armazenados no arquivo (cepJsonFinal.json)!");

        GeradorJson geraJson = new GeradorJson(requisicaoHttp.getMeuEndereco());
        sc.close();
    }
}

Valeu!!

1 resposta

Olá, João!

Parabéns pelo seu projeto final, parece que você fez um ótimo trabalho aqui!

Sua implementação parece bastante sólida. Você fez um bom uso do HttpClient para fazer requisições HTTP e do Gson para manipular JSON. Além disso, a maneira como você lidou com exceções é muito boa, principalmente a criação de uma exceção personalizada para o caso de um CEP inválido.

Aqui estão algumas sugestões para melhorar ainda mais seu código:

  1. Tratamento de erros: Você poderia adicionar mais tratamentos de exceções para cobrir outros cenários possíveis, como um erro de conexão com a API.

  2. Validação do CEP: Você poderia adicionar uma validação do CEP antes de fazer a requisição. Por exemplo, você poderia verificar se o CEP tem exatamente 8 dígitos e se contém apenas números.

  3. Fechamento de recursos: No seu método GeradorJson, seria uma boa prática fechar o FileWriter em um bloco finally ou usar um try-with-resources para garantir que o recurso seja fechado mesmo se uma exceção for lançada.

  4. Testes: Você poderia adicionar alguns testes unitários para garantir que seu código está funcionando como esperado.

  5. Comentários: Embora seu código seja bastante claro, adicionar mais comentários poderia ajudar outros desenvolvedores a entender melhor o que cada parte do código faz.

Espero ter ajudado e bons estudos!