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);
}
}