Xamarin.Forms - Acessando a base de filmes do NetFlix - I


Neste artigo vou mostrar como trabalhar com lista de itens, exibindo textos e imagens em lista roláveis usando a view ListView e apresentando alguns dos seus recursos. Vamos criar uma pequena aplicação que acessa a base de filmes da NetFlix.

Esse é um artigo prático que mostra como usar alguns recursos do Xamarin.Forms para criar uma aplicação simples mas funcional e útil.

O objetivo da aplicação é acessar a base de filmes do NetFlix fazendo uma busca por nome de ator e relacionando os filmes encontrados exibindo a imagem , o nome e o ano de lançamento do filme em uma view ListView.

O usuário poderá selecionar um filme para obter mais detalhes sobre o mesmo como um pequeno resumo do filme bem como sua imagem e título.

Nesta aplicação vamos aprender a fazer o seguinte:

  • Acessar um serviço RESTFull
  • Realizar a busca de informações usando uma consulta do lado do cliente
  • Serializar e deserializar dados remotos no formato JSON
  • Exibir os dados em um controle ListView usando um DataTemplate
  • Usar a navegação entre as páginas para exibir detalhes de um filme

Abaixo vemos as duas páginas da aplicação :

1 - A página principal onde o usuário digita o nome do autor e exibe os filmes;
2 - A página de detalhes que exibe os detalhes do filme;

A primeira coisa que vou definir será a url de acesso a base de filmes Netflix : " http://netflixroulette.net/api/api.php?actor={0}"

Se você digitar essa url no seu navegador e informar o nome de um ator vai obter o seguinte resultado:

Ai temos os dados dos filmes no formato JSON. Perceba que temos as informações informações :

  • show_id

  • show_title

  • rating

  • category

  • show_cast

  • director

  • summary

  • poster

Vamos usar algumas dessas informações para obter os dados dos filmes e exibir em nossa aplicação.

Isto posto vamos para a parte prática.

Criando um projeto no VS 2015 com Xamarin

Abra o Visual Studio Community 2015 e clique em New Project;

Selecione Visual C#, o template Cross Plataform e a seguir Blank App (Xamarin.Forms Portable);

NotaA opção Portable (Portable Class Library - PCL ) - Inclui todo o código comum em uma biblioteca de vínculo dinâmico (DLL) que pode então ser referenciada a partir de outros projetos;

Informe o nome AppRouletteNetFlix e clique no botão OK;

Ao clicar no botão OK, será criada uma solução contendo 4 projetos. (Dependendo do seu ambiente pode haver alguma variação nos projetos.)

O projeto comum possui a classe App.cs que irá conter o código compartilhado e que vamos usar neste artigo.

Incluindo as referências aos pacotes Json e HttpClient

Vamos incluir no projeto (em todos eles) as referências às bibliotecas NewtonSoft.Json e Microsoft.Net.Http para dar suporte a serialização dos dados no formato JSON e para realizar o acesso ao serviço RESTFull pela nossa aplicação.

No menu Tools clique em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

Selecione os pacotes conforme mostrado abaixo (um por vez), selecione instalar em todos os projetos e clique no botão Install.

Ao final teremos as referências incluídas em todos os projetos da nossa solução.

Criando a classe de domínio Movie

Vamos criar uma classe para representar as informações do nosso domínio que são as informações sobre os filmes que vamos usar na aplicação.

Vamos criar uma nova pasta no projeto compartilhado com o nome Models via menu Project -> Add New Folder.

A seguir clique com o botão direito do mouse sobre a pasta Models e clique em Add Class e informe o nome Movie.cs e a seguir inclua o código abaixo nesta classe:

using Newtonsoft.Json;
namespace AppRouletteNetFlix.Model
{
    public class Movie
    {
        [JsonProperty("show_title")]
        public string Title { get; set; }
        [JsonProperty("release_year")]
        public int ReleaseYear { get; set; }
        [JsonProperty("poster")]
        public string ImageUrl { get; set; }
        [JsonProperty("summary")]
        public string Summary { get; set; }
    }
}

Note que usamos o atributo JsonProperty("nome_campo") para mapear uma propriedade JSON para um membro da plataforma .NET além de especificar os métodos get/set da nossa classe Movie.

Criando um serviço para acessar a base de filmes do NetFlix

Vamos criar uma nova pasta no projeto compartilhado com o nome Service via menu Project -> Add New Folder.

Nesta pasta vamos definir uma classe que irá acessar o serviço RESTfull disponibilizado pela NetFlix.

A seguir clique com o botão direito do mouse sobre a pasta Service e clique em Add Class e informe o nome MovieService.cs e a seguir inclua o código abaixo nesta classe:

using AppRouletteNetFlix.Model;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace AppRouletteNetFlix.Service
{
    public class MovieService
    {
        private HttpClient _client = new HttpClient();
        private List<Movie> _movies;
     
       public async Task<List<Movie>> LocalizaFilmesPorAtor(string ator)
        {
            if (string.IsNullOrWhiteSpace(ator))
            {
                return null;
            }
            else
            {
                string url = string.Format("http://netflixroulette.net/api/api.php?actor={0}", ator);
                var response = await _client.GetAsync(url);
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    _movies = new List<Movie>();
                }
                else
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var movies = JsonConvert.DeserializeObject<List<Movie>>(content);
                    _movies = new List<Movie>(movies);
                }
                return _movies;
            }
       }
    }
}

Note que muitos dos métodos da classe HttpClient são async pois eles realizam operações I/O de rede.

Definimos o a URI onde temos o serviço REST : http://netflixroulette.net/api/api.php?actor={0}

O método GetAsync envia uma requisição HTTP GET de forma assíncrona. A palavra chave await suspende a execução até que o método assíncrono termine e quando isso ocorrer ele retorna um HttpResponseMessage que contém um response HTTP.

Se o código do status no response for um código de sucesso, o corpo do response conterá a representação JSON dos filmes.

Chamamos então o método ReadAsStringAsync pois o corpo do response pode ser grande e a seguir deserializamos os dados JSON para objetos com base em nosso modelo de domínio Movie e retornamos uma lista dos filmes obtidos.

Na segunda parte do artigo  iremos cuidar da interface com o usuário criando as páginas que vamos usar em nossa aplicação.

"Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;"
Efésios 2:8,9

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti