Falta pouco!

0 dias

0 horas

0 min

0 seg

1
resposta

[Projeto] implementei alguns metodos para deixar a aplicação mais facil de usar

package com.alan.backend.springsemwebalura.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 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;
    }
}
package com.alan.backend.springsemwebalura.principal;

import com.alan.backend.springsemwebalura.model.DadosEpisodio;
import com.alan.backend.springsemwebalura.model.DadosSerie;
import com.alan.backend.springsemwebalura.model.DadosTemporada;
import com.alan.backend.springsemwebalura.service.ConsumoAPI;
import com.alan.backend.springsemwebalura.service.ConverteDados;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Principal {
    private final String ENDERECO = "https://www.omdbapi.com/?t=";
    private final String API_KEY = "&apikey=6585022c";
    private ConsumoAPI consumo = new ConsumoAPI();
    private ConverteDados converteDados = new ConverteDados();
    private String nomeSerie;
    private String enderecoAPI;
    private Scanner leitura = new Scanner(System.in);

    public void exibeMenu() {
        System.out.println("digite o nome da serie");
        nomeSerie = leitura.nextLine();

        enderecoAPI = ENDERECO + nomeSerie.replace(" ", "+") + API_KEY;

        var opcao = 0;

        System.out.println("Escolha a opção: ");
        System.out.println("1: dados da serie");
        System.out.println("2: dados da temporada");
        opcao = leitura.nextInt();

        switch (opcao) {
            case 1:
                exibirDadosSerie();
                break;
            case 2:
                exibirTemporadasSerie();
                break;
            default:
                break;
        }


    }

    private void exibirDadosSerie() {
        var json = consumo.obterDados(enderecoAPI);
        DadosSerie dados = converteDados.obterDados(json, DadosSerie.class);

        System.out.println(dados);
    }

    private void exibirTemporadasSerie() {

        var json = consumo.obterDados(enderecoAPI);
        DadosSerie dados = converteDados.obterDados(json, DadosSerie.class);
        List<DadosTemporada> listTemporada = new ArrayList<>();

        for (int i = 1; i < dados.totalTemporadas(); i++) {
            enderecoAPI = ENDERECO + nomeSerie.replace(" ", "+") + "&season=" + i + API_KEY;
            json = consumo.obterDados(enderecoAPI);
            DadosTemporada dadosTemporada = converteDados.obterDados(json, DadosTemporada.class);
            listTemporada.add(dadosTemporada);

        }

        listTemporada.forEach(System.out::println);
        listTemporada.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));

//        for (int i = 0; i < dados.totalTemporadas(); i++) {
//            List<DadosEpisodio> episodioList = listTemporada.get(i).episodios();
//            for (int j = 0; j < episodioList.size(); j++) {
//                System.out.println(episodioList.get(j).titulo());
//            }
//        }


    }


}
package com.alan.backend.springsemwebalura;

import com.alan.backend.springsemwebalura.model.*;
import com.alan.backend.springsemwebalura.principal.Principal;
import com.alan.backend.springsemwebalura.service.ConsumoAPI;
import com.alan.backend.springsemwebalura.service.ConverteDados;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class SpringSemWebAluraApplication implements CommandLineRunner {

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

    //metodo main do spring boot
    @Override
    public void run(String... args) throws Exception {
        Principal principal = new Principal();
        principal.exibeMenu();
    }
}
1 resposta

Oi, Alan! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei de como você compôs ConsumoAPI e ConverteDados integrados ao menu em Principal; do jeito que você explicou, o fluxo fica claro. O problema pode estar nesse ponto: no for (int i = 1; i < dados.totalTemporadas(); i++) a última temporada não é incluída; use <=. Importante também evitar recriar HttpClient a cada chamada e ocultar API_KEY via variável de ambiente.

Uma dica interessante para o futuro é ler a chave com System.getenv, reutilizar um HttpClient único, codificar o título da série e validar o status HTTP. Veja este exemplo:


import java.net.http.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class ConsumoAPI {
    private static final HttpClient CLIENT = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .build();

    public String obterDados(String baseUrl, String titulo, String apiKey) {
        String t = URLEncoder.encode(titulo, StandardCharsets.UTF_8);
        String url = baseUrl + t + "&apikey=" + apiKey;
        HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
        try {
            HttpResponse<String> res = CLIENT.send(req, HttpResponse.BodyHandlers.ofString());
            if (res.statusCode() != 200) throw new RuntimeException("HTTP " + res.statusCode());
            return res.body();
        } catch (Exception e) {
            throw new RuntimeException("Falha ao buscar dados", e);
        }
    }
}

Sem acentos: String chave = System.getenv("OMDB_API_KEY");
Breve explicacao: ele reutiliza o client, valida o status e evita expor a chave.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!