Meu código para o desafio final com todas as classes, foi muito divertido e gratificante conseguir realizar esse desafio.
package zanotelli.fipe.main;
import zanotelli.fipe.model.Dados;
import zanotelli.fipe.model.ModeloCarro;
import zanotelli.fipe.model.Modelos;
import zanotelli.fipe.service.DataConverter;
import zanotelli.fipe.service.GetRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Principal {
Scanner scanner = new Scanner(System.in);
final String ENDERECO_BASE = "https://parallelum.com.br/fipe/api/v1/";
public void Main() {
System.out.println("****************\n");
System.out.println("Escolha o tipo de veículo que está buscando");
System.out.println("Carro\nMoto\nCaminhão\n");
System.out.println("****************");
String escolha = scanner.nextLine();
String busca;
if(escolha.toLowerCase().contains("carr")) {
busca = ENDERECO_BASE+"carros/marcas/";
} else if(escolha.toLowerCase().contains("moto")) {
busca = ENDERECO_BASE+"motos/marcas/";
} else {
busca = ENDERECO_BASE+"caminhoes/marcas/";
}
var json = GetRequest.Request(busca);
var marcas= DataConverter.listConvert(json, Dados.class);
marcas.forEach(m -> System.out.println("Marca: " + m.nome() + ", Código: ["+m.codigo()+"]"));
System.out.println("\nDigite o código da marca que deseja buscar: ");
escolha = scanner.nextLine();
busca = busca + escolha +"/modelos/";
json = GetRequest.Request(busca);
var modelosLista = DataConverter.dataConvert(json,Modelos.class);
modelosLista.modelos()
.forEach(m -> System.out.println("Modelo: " + m.nome() + ", Código: ["+m.codigo()+"]"));
System.out.println("\nDigite o código do modelo que você deseja: ");
escolha = scanner.nextLine();
busca = busca + escolha +"/anos/";
json = GetRequest.Request(busca);
var modelosCarros = DataConverter.listConvert(json, Dados.class);
List<String> CodigoModelos = modelosCarros.stream()
.map(Dados::codigo).toList();
List<ModeloCarro> carrosModelos = new ArrayList<>();
for(String c : CodigoModelos) {
json = GetRequest.Request(busca +c);
var carros = DataConverter.dataConvert(json, ModeloCarro.class);
carrosModelos.add(carros);
}
carrosModelos.forEach(c -> System.out.println(
"Modelo: " + c.Modelo() +
", Marca: " + c.Marca() + ", Valor: " + c.Valor() + ", Combustivel: " + c.Combustivel() +
", Ano: " + c.AnoModelo()
));
}
}
Classe de Request com metodo estatico
package zanotelli.fipe.service;
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 GetRequest {
public static String Request(String endereco) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endereco))
.build();
HttpResponse<String> response = null;
try {
response = client
.send(request, HttpResponse.BodyHandlers.ofString());
}
catch(IOException | InterruptedException e) {
throw new RuntimeException(e);
}
return response.body();
}
}
Classe conversora
package zanotelli.fipe.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import java.util.List;
public class DataConverter {
private static ObjectMapper mapper = new ObjectMapper();
static public <T> T dataConvert(String json, Class<T> classe) {
try {
return mapper.readValue(json,classe);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
static public <T> List<T> listConvert(String json, Class<T> classe) {
CollectionType lista = mapper.getTypeFactory()
.constructCollectionType(List.class, classe);
try {
return mapper.readValue(json,lista);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
Optei por não utilizar as interfaces e sim metodos estaticos