Integrar Web API de .NET en proyecto de Xamarin.Forms utilizando Visual Studio y Azure API App

Nota:

Este post es la continuación de la guía: Integración Continua para Android Xamarin.Forms usando VS Team Services, VS Source Control y VS Mobile Center, favor de realizar primero los paso del post antes de seguir con esta publicación.

Para crear una aplicación altamente disponible, escalable y tolerante a errores, vamos a crear una Web API para luego conectarla con nuestra aplicación y después desplegaremos la API en Azure para obtener todos los beneficios de una infraestructura de nube.

Pre-Requisitos

 

Crear Web API como Azure API App

Antes que nada, creamos una carpeta de solución llamada: “Azure.AppService” y posteriormente agregamos un nuevo proyecto Web API como Azure API App en Visual Studio:

Templates –> Visual C# –> Web –> ASP.NET Web Application

1

2

Veremos en nuestro proyecto un controlador llamado “ValuesController”, este controlador es creado por default. Al final nuestra API debe de versé algo así:

3

 

Crear API de clientes

Vamos a modificar nuestra API borrando  el controlador por default y creamos uno nuevo llamado: “CustomerController”:

11

12

13

15

 

Ingresamos el siguiente código:

using System.Collections.Generic;
using System.Web.Http;

namespace Xamarin.Forms.API.Controllers
{
    [RoutePrefix("customer")]
    public class CustomerController : ApiController
    {
        public IHttpActionResult GetAll()
        {
            var result = new List<string>()
            {
                "Jorge Castro",
                "Roberto Lamas",
                "Saul R."
            };
            return Ok(result);
        }
    }
}


       
 

Crear recurso API App en portal de Azure

Ingresamos al portal de Azure e ingresamos a “Marketplace” y buscamos por API App:

https://portal.azure.com

19

20

21

 

Desplegar Web API a Azure API App

Una vez creado el controlador y recurso en Azure, obtendremos la siguiente URL: {server}/api/customer

Para publicar en Azure daremos clic derecho en el proyecto “Xamarin.Forms.API” y elegimos la opción de “Publish”:

17

23

24

25

22


Ahora podemos probar la API creando peticiones desde un Rest Client como “Postman”, o ingresando  la siguiente URL al navegador:

https://api-xamarin.azurewebsites.net/api/customer

26

image


Crear PCL Class Library (Xamarin.Forms) para hacer llamadas a Web API

Vamos a crear una carpetas de solución llamada “Xamarin.ServiceLayer” y luego agregamos un nuevo proyecto PCL llamado: “Xamarin.Forms.Service”.

4

image

 

Crear nuevo proyecto Cross Platform Class Library (Xamarin.Forms) en Visual Studio:
Templates –> Visual C# –> Cross-Platform–> Class Library (Xamarin.Forms)

34

8

Una vez creado nuestro proyecto, nuestra solución debe de lucir algo así:

9


Aseguremos que los targets de  los PCLs sean los mismos, podemos configurar los targets ingresando a las propiedades de cada proyecto.

Compara los proyectos: “Xamarin.Forms.Service” contra “Xamarin.Forms.Android.CI”

Clic derecho en proyecto –> Properties –> Library –> Targeting

image

 

Agregar referencia de capa de servicios

Damos clic derecho en las referencias del proyecto “Xamarin.Forms.Andorid.CI” y agregamos el proyecto de servicios:

28

29


Crear métodos para llamar a Azure API App

Para crear llamadas a una Web API, me gusta crear un interface para luego poder obtener una mayor flexibilidad al implementar lógica de negocio.

Empecemos por agregar dos clases nuevas, una interface  llamada: “IApi.cs” y una clase llamada: “WebApi.cs”

Ingresamos el siguiente código:

Interface IApi.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Xamarin.Forms.Service
{
    public interface IApi
    {
        Task<list<string>> GetCustomerAll();
    }
}

WebApi.cs

using System.Collections.Generic;
using System.Net.Http;
using Newtonsoft.Json;
using System.Threading.Tasks;

namespace Xamarin.Forms.Service
{
    public class WebApi : IApi
    {
        private static string _api_url = "https://api-xamarin.azurewebsites.net/api/";
        private static string customerPath = "customer";

        public async Task<list<string>> GetCustomerAll()
        {
            using (var client = new HttpClient())
            {                
                var response = await client.GetAsync(_api_url+ customerPath);
                var result = new List<string>();
                if (response.IsSuccessStatusCode)
                {
                    var customers = await response.Content.ReadAsStringAsync();
                    result = JsonConvert.DeserializeObject<list<string>>(customers);
                }
                
                return result;
            }
        }
    }
}

Aseguremos de agregar el NuGet de Newtonsoft.Json

image


Llamar Web API desde proyecto de Xamarin.Forms

Por ultimo vamos a modificar el código de nuestra página principal para realizar una petición a la API en Azure. 

MainPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Xamarin.Forms.Android.CI"
             x:Class="Xamarin.Forms.Android.CI.MainPage">

    <Label x:Name="Customers"
           VerticalOptions="Center" 
           HorizontalOptions="Center">
    </Label>

</ContentPage>

 

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Service;

namespace Xamarin.Forms.Android.CI
{
    public partial class MainPage : ContentPage
    {
        IApi _api = new WebApi();
        public MainPage()
        {
            InitializeComponent();
            Init();
        }
        private async void Init()
        {
            var result = await CallWebApi();
            Device.BeginInvokeOnMainThread(() =>
            {
                foreach (var customer in result)
                {
                    Customers.Text += string.Format("{0} ", customer);
                }
                
            });          
        }
        public async Task> CallWebApi()
        {
            var customers = await _api.GetCustomerAll();
            return customers;
        }
    }
}

Ahora podemos compilar y hacer debug de nuestra aplicación.

Como siguiente paso vamos a subir cambios a VS Source Control para disparar el trigger de Integración Continua y luego instalar nuestra app desde VS Mobile Center. Nuestra app debería de mostrar los nombre de los clientes que definimos en nuestra API.

 

Subir cambios a Source Control

Hacemos check-in en Team Explorer y esperamos a que el proceso de compilación finalice:

image

33

image


Instalar aplicación desde Mobile Center

Para instalar la aplicación en nuestros dispositivos Android, solo necesitamos ingresar a la ruta: https://install.mobile.azure.com y luego iniciar sesión en Mobile Center.

Una vez en el sitio, navegamos a la aplicación: “Xamarin.Forms.Andorid.CI” y luego instalamos:

Screenshot_2017-05-13-16-27-19_thumb image Screenshot_2017-05-13-16-31-37_thumb

Screenshot_2017-05-13-17-07-59_thumb Screenshot_2017-05-13-17-08-13_thumb Screenshot_2017-05-13-17-24-56_thumb

image


Genial! Como resultado tenemos una lista de nombre, los cuales definimos en nuestra API.

Hasta el momento hemos integrado una Web API desplegada en Azure API App usando Visual Studio, y gracias a las características de VSTS hemos firmado y desplegado nuestra app de Xamarin al sitio de Mobile Center, el cual se encarga de hacer visible nuestra aplicación para ser instalada.

 

Siguientes pasos:

  • Integración Continua para Web API de .NET usando Visual Studio Team Services y Azure App Service

 

Saludos!

Comments

Popular posts from this blog

Configurar y desplegar una Web API en Azure App Service Environment

Patrones de diseño para aplicaciones de alta disponibilidad en Azure - Resilient Applications (Parte I: Retry Policy)

Publicar resultados de una consulta de Azure SQL Database a Azure Service Bus con Logic App

Despliegue de contenedores Docker a Azure Web Apps