Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Duda] Estoy empezando con el minidesafio de refactorizar todo de la clase main

Dentro de la clase 4 persistiendo datos en archivos cuando se termina el ultimo video de escribiendo la lista de peliculas en json, el instructor manda un desafio de refactorizar la clase main, estoy siguiendo las clases sugeridas:

  1. una encargada para obtener las peliculas
  2. otra para guardar las peliculas en JSON
  3. otra para transformar lo que viene del api de OMDB en la clase titulo

nada mas que me quede atorado en ideas :c, por ahora lo tengo asi comentado

package principal;

import com.aluracursos.screenmatch.modelos.Titulo;
import com.aluracursos.screenmatch.dto.TituloOmdb;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrincipalConBusqueda {
    static void main(String[] args) throws IOException, InterruptedException {
        Scanner lectura = new Scanner(System.in);

        List<Titulo> titulos = new ArrayList<>();

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();

        String baseUrl = "http://www.omdbapi.com/?t=";
        String apiKey = "&apikey=18fcf0c5";

        while (true) {
            System.out.println("Escribe el nombre de la pelicula que quieres buscar: ");
            var busqueda = lectura.nextLine();
            if (busqueda.equalsIgnoreCase("salir")){
                break;
            }

            String direccionEncoder = URLEncoder.encode( busqueda, StandardCharsets.UTF_8 );
            String direccion = baseUrl + direccionEncoder + apiKey;

            try {
                //clase encargada de guardar las peliculas en json
                HttpClient client = HttpClient.newHttpClient();

                HttpRequest request = HttpRequest.newBuilder()
                        .uri(URI.create(direccion))
                        .build();

                HttpResponse<String> response = client
                        .send(request, HttpResponse.BodyHandlers.ofString());


                String json = response.body();
                System.out.println(json);

                TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
                System.out.println(miTituloOmdb);

                Titulo miTitulo = new Titulo(miTituloOmdb);
                System.out.println(miTitulo);

                titulos.add(miTitulo);

                //Exceptions
            } catch (NumberFormatException e) {
                System.out.println("La pelicula no cuenta con un valor valido 'runtime': " + e.getMessage());
            } catch (RuntimeException e) {
                System.out.println("Error, se malinterpreta: " + e.getMessage());
            } catch (UnsupportedEncodingException e){
                System.out.println("Error con la clase encoder: " + e.getMessage());
            }
        }

        System.out.println(titulos);
        //clase encargada de transformar lo que viene de omdb en la clase titulo
        //FileWriter
        FileWriter escritura = new FileWriter("Titulos.json");
        escritura.write(gson.toJson(titulos));
        //cerramos la escritura
        escritura.close();

        System.out.println("Fin del programa");


    }
}

pero no se si sea suficiente, me hago bolas solo

1 respuesta

Bueno ya hice algo no se si este bien:

  1. clase Main:
package principal;

import com.aluracursos.screenmatch.modelos.Titulo;
import com.aluracursos.screenmatch.dto.TituloOmdb;
import com.aluracursos.screenmatch.service.GetMovies;
import com.aluracursos.screenmatch.service.SaveMoviesInJson;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrincipalConBusqueda {
    static void main(String[] args) throws IOException, InterruptedException {
        Scanner lectura = new Scanner(System.in);

        List<Titulo> titulos = new ArrayList<>();
        GetMovies consult = new GetMovies();

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();



        String baseUrl = "http://www.omdbapi.com/?t=";
        String apiKey = "&apikey=18fcf0c5";

        while (true) {
            System.out.println("Escribe el nombre de la pelicula que quieres buscar: ");
            var busqueda = lectura.nextLine();
            if (busqueda.equalsIgnoreCase("salir")){
                break;
            }

            String direccionEncoder = URLEncoder.encode( busqueda, StandardCharsets.UTF_8 );
            String direccion = baseUrl + direccionEncoder + apiKey;

            try {
                //clase GetMovies
                String json = consult.getAllMovies(direccion);
                System.out.println(json);

                TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
                System.out.println(miTituloOmdb);

                Titulo miTitulo = new Titulo(miTituloOmdb);
                System.out.println(miTitulo);

                titulos.add(miTitulo);

                //Exceptions
            } catch (NumberFormatException e) {
                System.out.println("La pelicula no cuenta con un valor valido 'runtime': " + e.getMessage());
            } catch (RuntimeException e) {
                System.out.println("Error, se malinterpreta: " + e.getMessage());
            }
        }

        System.out.println(titulos);

        SaveMoviesInJson generator = new SaveMoviesInJson();
        generator.generateJson(titulos);


        System.out.println("Fin del programa");


    }
}
  1. clase GetMovies:
package com.aluracursos.screenmatch.service;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class GetMovies {

    public String getAllMovies(String direccion) {
        try {
            HttpClient client = HttpClient.newHttpClient();

            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(direccion))
                    .build();

            HttpResponse<String> response = client
                    .send(request, HttpResponse.BodyHandlers.ofString());

            return response.body();

        } catch (Exception e) {
            throw new RuntimeException("No se pudo obtener los datos de la pelicula" + e.getMessage());
        }
    }
}
  1. Clase SaveMoviesInJson:
package com.aluracursos.screenmatch.service;

import com.aluracursos.screenmatch.modelos.Titulo;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class SaveMoviesInJson {
    private Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .setPrettyPrinting()
            .create();

    //clase encargada de transformar lo que viene de omdb en la clase titulo
    public void generateJson(List<Titulo> titulos) throws IOException {

        try(FileWriter escritura = new FileWriter("Titulos.json")) {
            escritura.write(gson.toJson(titulos));

        }
    }
}

estoy empezando a usar variables y todo en ingles, por buenas practicas, cree una carpeta llamada service y meti estas clases dentro, cree otra carpeta llamada dto y movi la dto de modelos a su package, y para terminar cree otro package llamado repository y movi los repositorios de calculos a esta mencionada...