Xamarin Forms - Acessando dados via REST e vinculando objetos aninhados(JSON)


Neste artigo vou mostrar como acessar informações usando um serviço REST e como exibir informações de objetos aninhados usando o databinding.

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 o endereço http://jsonplaceholder.typicode.com/users/ e tratar a informações em um ListView e uma página de detalhes.

As informações básicas serão exibidas no ListView e o usuário poderá selecionar um item para obter mais detalhes sobre o mesmo onde iremos exibir as demais informações acessando objetos aninhados.

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

  • Acessar um serviço RESTFull
  • 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 acessamos o serviço REST e exibimos o nome e o email do usuário em um ListView;
2 - A página de detalhes que exibe os detalhes do usuário;

A primeira coisa que vou definir será a url de acesso aos dados : http://jsonplaceholder.typicode.com/users/"

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

Ai temos os dados no formato JSON.

Para gerar as classes para as informações acima acesse o site : http://json2csharp.com/  e digite a url na caixa de texto e clique no botão Generate.

Ao final você verá as classes geradas conforme abaixo. Vamos usar essas classess para definir o nosso modelo de domínio:

Vamos apenas alterar o nome da classe RootObject para User.

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);

Informe o nome XF_Rest 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 User

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

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

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

Nota: Cole os dados que você obteve a partir do site http://json2csharp.com/

 public class Geo
    {
        public string lat { get; set; }
        public string lng { get; set; }
    }
    public class Address
    {
        public string street { get; set; }
        public string suite { get; set; }
        public string city { get; set; }
        public string zipcode { get; set; }
        public Geo geo { get; set; }
    }
    public class Company
    {
        public string name { get; set; }
        public string catchPhrase { get; set; }
        public string bs { get; set; }
    }
    public class User
    {
        public int id { get; set; }
        public string name { get; set; }
        public string username { get; set; }
        public string email { get; set; }
        public Address address { get; set; }
        public string phone { get; set; }
        public string website { get; set; }
        public Company company { get; set; }
    }

Criando um serviço para acessar o serviço Rest

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

Nesta pasta vamos definir uma classe que irá acessar o serviço RESTfull disponibilizado em http://jsonplaceholder.typicode.com/users/.

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

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using XF_WebApi.Model;
namespace XF_WebApi.Services
{
    public class UsuarioService
    {
        private HttpClient _client = new HttpClient();
        private List<User> _users;
        public async Task<List<User>> GetUsuarioPorNomeAsync(int _userId)
        {
            string url = string.Format("http://http://jsonplaceholder.typicode.com/users/" + _userId);
            if (_userId <= 0)
            {
                return null;
            }
            else
            {
                var response = await _client.GetAsync(url);
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    _users = new List<User>();
                }
                else
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var usuarios = JsonConvert.DeserializeObject<List<User>>(content);
                    _users = new List<User>(usuarios);
                }
                return _users;
            }
        }
        public async Task<List<User>> GetUsuariosAsync()
        {
            try
            {
                string url = string.Format("http://jsonplaceholder.typicode.com/users/");
                var response = await _client.GetAsync(url);
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    _users = new List<User>();
                }
                else
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var usuarios = JsonConvert.DeserializeObject<List<User>>(content);
                    _users = new List<User>(usuarios);
                }
                return _users;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

Esta classe possui dois métodos :

O primeiro pode ser usado para obter os dados de um usuário pelo seu id e não será usado neste artigo. Vamos usar o segundo método GetUsuariosAsync() que retorna todos os usuários.

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://jsonplaceholder.typicode.com/users/

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 usuários.

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 User e retornamos uma lista dos dados 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 onde vamos exibir os usuários e os detalhes do usuário.

Porque a palavra da cruz é loucura para os que perecem; mas para nós, que somos salvos, é o poder de Deus.
Porque está escrito: Destruirei a sabedoria dos sábios, E aniquilarei a inteligência dos inteligentes.
1 Coríntios 1:18,19

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 ?

     Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti