1
resposta

[Projeto] Busca Tabela Fipe

ConverterDados:

import br.com.alura.TabelaFIPE.principal.Principal;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TabelaFipeApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(TabelaFipeApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Principal principal = new Principal();
        principal.exibeMenu();
    }
}

CONSUMO API

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 ConsumoAPI {

    public String obterDados(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 e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        String json = response.body();
        return json;
    }
}

DADOS

public record Dados (String codigo, String nome){
}

MODELOS

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public record Modelos(List<Dados> modelos) {
}

VEICULO

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public record Veiculo(
        @JsonAlias("TipoVeiculo")Integer tipoVeiculo,
        @JsonAlias("Valor") String valor,
        @JsonAlias("Marca") String marca,
        @JsonAlias("Modelo") String modelo,
        @JsonAlias("AnoModelo") Integer ano,
        @JsonAlias("Combustivel") String tipoCombustivel,
        @JsonAlias("MesReferencia") String mesReferencia,
        @JsonAlias("SiglaCombustivel") String siglaCombustivel ) {

    @Override
    public String toString() {
        return "******************************************" +
                "\nTipo do Veiculo:" + this.tipoVeiculo +
                " Ano Modelo: " + this.ano +
                " Modelo: " + this.modelo +
                "\n Marca: " + this.marca +
                "\n Combustivel: " + this.tipoCombustivel + "-" + this.siglaCombustivel +
                "\n Valor Tabela Fipe: " + this.valor +
                "\n******************************************";
    }
}
1 resposta

PRINCIPAL

import br.com.alura.TabelaFIPE.model.Dados;
import br.com.alura.TabelaFIPE.model.Modelos;
import br.com.alura.TabelaFIPE.model.Veiculo;
import br.com.alura.TabelaFIPE.service.ConsumoAPI;
import br.com.alura.TabelaFIPE.service.ConverterDados;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Principal {
    //Objetos de Objetos para interagir com os dados
    private Scanner leitura = new Scanner(System.in);
    private ConsumoAPI consumoAPI = new ConsumoAPI();
    private ConverterDados conversor = new ConverterDados();

    private final String URL_BASE = "https://parallelum.com.br/fipe/api/v1/";


    public void exibeMenu(){
        Integer opcao=0;
        String endereco = null;

        var menu = """
                *********************************************
                *** OPÇÕES => Escolha o tipo de veículo:  ***
                1 - Carros
                2 - Motos
                3 - Caminhões
                4 - Sair
                
                Digite uma das opções para consulta: 
                """;
        System.out.println(menu);
        opcao =leitura.nextInt();
        leitura.nextLine();

        if (opcao==1){endereco = URL_BASE + "carros/marcas";}
        else if (opcao==2) {endereco = URL_BASE + "motos/marcas";}
        else if (opcao==3) {endereco = URL_BASE +"caminhoes/marcas";}
        else if (opcao==4){
            System.out.println("**** Programa Finalizado****");
            return;
        }else{
            System.out.println("Opção Inválida");
            return;
        }

        if(endereco == null || endereco.isBlank()){
            System.out.println("Endereço Inválido!! Encerrando execução.");
            return;
        }

        var json = consumoAPI.obterDados(endereco);
        System.out.println(json);
        var marcas = conversor.obterLista(json, Dados.class);
        marcas.stream()
                .sorted(Comparator.comparing(Dados::codigo))
                .forEach(System.out::println);

        System.out.println("Informe o código da marca do carro para consulta: ");
        var codigomarca = leitura.nextLine();

        endereco = endereco + "/"+ codigomarca +"/modelos";
        json = consumoAPI.obterDados(endereco);
        var modeloLista = conversor.obterDados(json, Modelos.class);

        if(modeloLista.modelos()==null){
            System.out.println("Não foram encontrados modelos para essa marca.");
            return;
        }

        System.out.println("\n Modelos da marca escolhida: ");
        modeloLista.modelos().stream()
                .sorted(Comparator.comparing(Dados::codigo))
                .forEach(System.out::println);

        System.out.println("\n Digite o nome do carro que deseja informações : ");
        var nomecarro = leitura.nextLine();

        List<Dados> modelosfiltrados = modeloLista.modelos().stream()
                .filter(m -> m.nome().toLowerCase().contains(nomecarro.toLowerCase()))
                .collect(Collectors.toList());
        System.out.println("\nModelos Filtrados: ");
        modelosfiltrados.forEach(System.out::println);

        System.out.println("Digite o código do modelo: ");
        var codigoModelo = leitura.nextLine();

        endereco = endereco +"/"+codigoModelo+"/anos";
        json = consumoAPI.obterDados(endereco);
        List<Dados> anos = conversor.obterLista(json, Dados.class);
        List<Veiculo> veiculos = new ArrayList<>();


        for (int i = 0; i < anos.size(); i++) {
            var enderecoAnos = endereco +"/"+anos.get(i).codigo();
            json = consumoAPI.obterDados(enderecoAnos);
            Veiculo veiculo = conversor.obterDados(json, Veiculo.class);
            veiculos.add(veiculo);

        }

        System.out.println("\n\n Veiculos filtrados por ano: ");
        veiculos.forEach(System.out::println);
    }
}

TABELA FIPE

import br.com.alura.TabelaFIPE.principal.Principal;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TabelaFipeApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(TabelaFipeApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Principal principal = new Principal();
        principal.exibeMenu();
    }
}