1
resposta

[Projeto] Resolução dos desafios

Interface

namespace DesafiosAluraApi.ConsumindoApi.Interface;

public interface IApiMethods
{
    public List<T> GetAll<T>(HttpClient client) where T : class;

    public void ViewMovieInformation();
}

Filme

using DesafiosAluraApi.ConsumindoApi.Interface;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace DesafiosAluraApi.ConsumindoApi;

public class MovieApi : IApiMethods
{
    public readonly static string _url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/TopMovies.json";

    [JsonPropertyName("rank")]
    public string? Rank { get; set; }

    [JsonPropertyName("fullTitle")]
    public string? Title { get; set; }

    [JsonPropertyName("imDbRating")]
    public string? Rating { get; set; }

    public void ViewMovieInformation() =>
        Console.WriteLine($"Classificação: {Rank}\nTítulo: {Title}\nNota: {Rating}\n\n");

    public List<T> GetAll<T>(HttpClient client) where T : class
    {
        var result = client.GetStringAsync(_url).Result;

        List<T> List = JsonSerializer.Deserialize<List<T>>(result) ?? [];

        return List;
    }
}

País

using System.Text.Json.Serialization;
using System.Text.Json;
using DesafiosAluraApi.ConsumindoApi.Interface;

namespace DesafiosAluraApi.ConsumindoApi;

public class CountryApi : IApiMethods
{
    public readonly static string _url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Paises.json";

    [JsonPropertyName("nome")]
    public string? Name { get; set; }

    [JsonPropertyName("capital")]
    public string? Capital { get; set; }

    [JsonPropertyName("idioma")]
    public string? Language { get; set; }

    public void ViewMovieInformation() =>
        Console.WriteLine($"Páis: {Name}\nCapital: {Capital}\nIdioma: {Language}\n\n");

    public List<T> GetAll<T>(HttpClient client) where T : class
    {
        var result = client.GetStringAsync(_url).Result;

        List<T> List = JsonSerializer.Deserialize<List<T>>(result) ?? [];

        return List;
    }
}

Carro


using System.Text.Json.Serialization;
using System.Text.Json;
using DesafiosAluraApi.ConsumindoApi.Interface;

namespace DesafiosAluraApi.ConsumindoApi;

public class CarApi : IApiMethods
{
    public readonly static string _url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Carros.json";

    [JsonPropertyName("marca")]
    public string? Brand { get; set; }

    [JsonPropertyName("modelo")]
    public string? Model { get; set; }

    [JsonPropertyName("ano")]
    public int Year { get; set; }

    [JsonPropertyName("motor")]
    public string? Engine { get; set; }

    public void ViewMovieInformation() =>
        Console.WriteLine($"Carro: {Brand} {Model}\nAno: {Year}\nMotor: {Engine}\n\n");

    public List<T> GetAll<T>(HttpClient client) where T : class
    {
        var result = client.GetStringAsync(_url).Result;

        List<T> List = JsonSerializer.Deserialize<List<T>>(result) ?? [];

        return List;
    }
}

Livro

using DesafiosAluraApi.ConsumindoApi.Interface;
using System.Text.Json.Serialization;
using System.Text.Json;

namespace DesafiosAluraApi.ConsumindoApi;

internal class BookApi : IApiMethods
{
    public readonly static string _url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Livros.json";

    [JsonPropertyName("titulo")]
    public string? Title { get; set; }

    [JsonPropertyName("autor")]
    public string? Author { get; set; }

    [JsonPropertyName("ano_publicacao")]
    public int Year { get; set; }

    [JsonPropertyName("genero")]
    public string? Genre { get; set; }

    public void ViewMovieInformation() =>
        Console.WriteLine($"Título: {Title}\nAutor: {Author}\nAno: {Year}\nGênero: {Genre}\n\n");

    public List<T> GetAll<T>(HttpClient client) where T : class
    {
        var result = client.GetStringAsync(_url).Result;

        List<T> List = JsonSerializer.Deserialize<List<T>>(result) ?? [];

        return List;
    }
}

Program

using DesafiosAluraApi.ConsumindoApi;
using DesafiosAluraApi.ConsumindoApi.Interface;

using (HttpClient client = new())
{
    var apiMethod = ((IApiMethods)new MovieApi()).GetAll<MovieApi>(client);
    var apiMethod2 = ((IApiMethods)new CountryApi()).GetAll<CountryApi>(client);
    var apiMethod3 = ((IApiMethods)new CarApi()).GetAll<CarApi>(client);
    var apiMethod4 = ((IApiMethods)new BookApi()).GetAll<BookApi>(client);

    apiMethod.ForEach(m => m.ViewMovieInformation());
    apiMethod2.ForEach(m => m.ViewMovieInformation());
    apiMethod3.ForEach(m => m.ViewMovieInformation());
    apiMethod4.ForEach(m => m.ViewMovieInformation());
}
1 resposta

Olá Phelipe, tudo beleza?

Parabéns, você está no caminho certo para resolver o desafio de consumir APIs e desserializar os dados em C#. Vou te dar algumas dicas e sugestões que podem te ajudar a avançar.

  1. Interface e Implementação: Você criou uma interface IApiMethods e a implementou nas classes MovieApi, CountryApi, CarApi e BookApi. Isso é ótimo para garantir que todas as classes sigam o mesmo contrato.

  2. Desserialização: Você está utilizando JsonSerializer.Deserialize para converter os dados JSON em objetos C#. Isso é exatamente o que você precisa fazer. No entanto, certifique-se de que a estrutura das classes que você criou (MovieApi, CountryApi, CarApi, BookApi) corresponde ao formato dos dados JSON que está consumindo.

  3. Uso do HttpClient: Você está usando HttpClient para fazer as requisições HTTP, o que é uma prática recomendada. Apenas tome cuidado com o uso de .Result para chamadas assíncronas, pois pode causar deadlocks em algumas situações. Considere usar await e tornar seus métodos assíncronos para evitar esse problema.

  4. Exibição das Informações: O método ViewMovieInformation está sendo usado para exibir informações no console. No entanto, o nome do método pode ser confuso, já que ele é chamado em todas as classes, não apenas em MovieApi. Considere renomeá-lo para algo mais genérico, como ViewInformation.

Espero ter ajudado e bons estudos!