Gostaria de compartilhar a minha resolução do desafio proposto ao final do curso "Java: consumindo API, gravando arquivos e lidando com erros", cuja proposta é uma consulta de informações na API ViaCEP.
ConsultaCepService.java
public class ConsultaCepService {
private Gson gson = new GsonBuilder().create();
private final String enderecoConsultaViaCep = "https://viacep.com.br/ws/%s/json/";
private final String cepRegex = "[0-9]{5}-?[0-9]{3}";
/**
* @description Método responsável por efetuar a busca das informações do CEP através da API ViaCEP. Retorna null em caso de erro.
*
* @param cep - String
* @return Endereco
*/
public Endereco buscaCep(String cep) {
Endereco endereco = new Endereco();
if(!cep.matches(cepRegex))
throw new IllegalArgumentException("CEP inválido!");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest
.newBuilder()
.uri(URI.create(enderecoConsultaViaCep.formatted(cep)))
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String respostaJsonViaCep = response.body();
if(respostaJsonViaCep.contains("Http 400"))
throw new ConsultaDeEnderecoException("A consulta no endereço falhou!");
EnderecoViaCep enderecoViaCep = gson.fromJson(respostaJsonViaCep, EnderecoViaCep.class);
endereco = new Endereco(enderecoViaCep);
endereco.exibirInformacoes();
return endereco;
} catch (ConsultaDeEnderecoException e) {
System.out.println(e.getMessage() + enderecoConsultaViaCep.formatted(cep));
} catch (IllegalStateException e) {
System.out.println("Erro ao converter resposta da consulta.");
} catch (IllegalArgumentException e) {
System.out.println("Houve um erro ao passar o argumento. Verifique o CEP que digitou - "+cep+". " + e.getMessage());
} catch (IOException | InterruptedException e) {
System.out.println("Erro ao buscar cep: " + e.getMessage());
}
return null;
}
}
CriaArquivoService.java
public class CriaArquivoService {
public Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
/**
* @description Método responsável por criar um arquivo contendo as informações do CEP consultado.
*
* @param enderecoConsultado - Endereco
*/
public void criaArquivoDeCepConsutado(Endereco enderecoConsultado) {
try {
FileWriter escritor = new FileWriter(enderecoConsultado.getCep() + ".json");
escritor.write(gson.toJson(enderecoConsultado));
escritor.close();
} catch (IOException e) {
System.out.println("Ocorreu um erro ao tentar escrever o arquivo de endereços consultados.");
}
}
}
ConsultaCepPrincipal.java
public class ConsultaCepPrincipal {
public static void main(String[] args) {
Scanner leitura = new Scanner(System.in);
String busca = "";
final String palavraChaveSair = "sair";
String mensagemBuscaCep = "Digite o CEP que deseja procurar: ";
ConsultaCepService consultaCepService = new ConsultaCepService();
CriaArquivoService criaArquivoService = new CriaArquivoService();
while (!busca.equalsIgnoreCase(palavraChaveSair)) {
System.out.println(mensagemBuscaCep);
busca = leitura.nextLine();
if(busca.equalsIgnoreCase(palavraChaveSair))
break;
try {
Endereco endereco = consultaCepService.buscaCep(busca);
if(Objects.nonNull(endereco)) {
criaArquivoService.criaArquivoDeCepConsutado(endereco);
}
} catch (IllegalArgumentException e) {
System.out.println("Houve um erro ao passar o argumento. Verifique o CEP que digitou - " + busca + ". " + e.getMessage());
}
}
}
}
Por fim, deixo o link do repositório no GitHub contendo o projeto completo. Projeto resolução consulta API ViaCEP