1
resposta

[Dúvida] Minha própria resolução, com um detalhe.

Olá, então como disse no titulo fiz a minha própria resolução do ViaCEP, porém da forma que eu fiz eu queria algumas sugestões tanto de organização e de como melhorar nesse quesito de API e desenvolvimento pessoal com programação. Pois tenho sentido dificuldade de por a mão na massa, até consigo uma coisa ou outra porém parece que só some tudo da cabeça na hora de começar um projeto.. é bizarro.

Agora com relação ao meu código eu queria uma ajuda, a aula que foi dada ela fez um record e atribuiu os dados de lá, já eu fiz get/set só do cep que acaba retornando tudo. Eu gostaria pegar os dados igual ela fez porém quanto tento fazer isso, meio que tentando adaptar n consigo.

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

Mesmo após eu criando um record, não funciona. Vou deixar o código como está, mas queria uma forma de solucionar esse caso. E mais uma coisa, eu tbm n consigo fazer o FileWriter, por conta do gson.. ele não cria a pasta como deveria.

Código cru, sem as modificações acima:

package VIACEP_DESAFIO_FINAL.exercicio;
import java.io.FileWriter;
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 ApiDados {
    int cep;

    private int getCep() {
        return cep;
    }

    public void setCep(String cep) throws ErroCepException{
        if(cep.length() != 8){
            throw new ErroCepException("CEP inválido, ele deve conter 8 dígitos.");

        }
        this.cep = Integer.parseInt(cep);
    }

    public ApiDados(int cep) {
        this.cep = cep;
    }
    public ApiDados() {

    }

        public void consultaCep() throws IOException, InterruptedException {
            HttpClient client = HttpClient.newHttpClient();
            String endereco = "https://viacep.com.br/ws/" + cep + "/json/";
            System.out.println("URL: " + endereco);

            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(endereco))
                    .build();
            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println(response.body());
        }

}

MAIN:

package VIACEP_DESAFIO_FINAL.exercicio;

import com.google.gson.Gson;

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

public class Main  {
    public static void main(String[] args) throws IOException, ErroCepException, InterruptedException {
        Scanner sc = new Scanner(System.in);
        ApiDados apidados = new ApiDados();
        Gson gson = new Gson();

        System.out.println("Digite o CEP: ");
          String cep = sc.nextLine();

          try{
              apidados.setCep(cep);
              apidados.consultaCep();
          }catch (ErroCepException e){
              System.out.println("Erro: " + e.getMessage());
          }catch (IOException | IllegalArgumentException e){
              System.out.println("Erro ao buscar dados do CEP" + e.getMessage());
          }

        sc.close();
    }
}

Excpetion:

package VIACEP_DESAFIO_FINAL.exercicio;

public class ErroCepException extends RuntimeException {
    public ErroCepException(String message) {

      super(message);
    }
}
1 resposta

Olá, Eduardo. Tudo bem?

Muito obrigado por compartilhar o seu código aqui com a gente. Parabéns pelo trabalho. Continue com essa dedicação.

Gostei do seu esforço em adaptar o código e procurar entender como melhorar o uso de APIs. A lógica de tratamento de erro que você implementou para o CEP está bem feita, especialmente com a criação da exceção personalizada ErroCepException. Isso mostra uma boa prática de separar a validação da entrada de dados da execução do processo.

Para melhorar o seu código e adaptar a parte do Gson com o record, o problema pode estar na forma como o Gson está tentando mapear o JSON de resposta para a classe Endereco. Ao invés de criar um record, você poderia usar a anotação @SerializedName para garantir que o Gson saiba como mapear os campos. Veja um exemplo:


public class Endereco {
    @SerializedName("cep")
    private String cep;
    @SerializedName("logradouro")
    private String logradouro;
    // outros campos aqui

    // getters e setters
}

Com isso, você pode criar a instância de Endereco dessa forma:


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

Isso deve resolver o seu problema com o Gson. Em relação ao FileWriter, a pasta precisa existir antes de você escrever o arquivo. Você pode usar File.mkdirs() para garantir que a pasta seja criada. Algo assim:


File folder = new File("pasta/destino");
if (!folder.exists()) {
    folder.mkdirs();
}

Conte com o apoio do Fórum. Abraços e bons estudos.