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
- Visual Studio 2015+
 - Cuenta en Visual Studio Team Services
 - Xamarin instalado en Visual Studio
 -  Iniciar sesión en https://mobile.azure.com con tu cuenta de Microsoft
 
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
Veremos en nuestro proyecto un controlador llamado “ValuesController”, este controlador es creado por default. Al final nuestra API debe de versé algo así:
Crear API de clientes
Vamos a modificar nuestra API borrando el controlador por default y creamos uno nuevo llamado: “CustomerController”:
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:
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”:
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
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”.
Una vez creado nuestro proyecto, nuestra solución debe de lucir algo así:
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
Agregar referencia de capa de servicios
Damos clic derecho en las referencias del proyecto “Xamarin.Forms.Andorid.CI” y agregamos el proyecto de servicios:
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
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:
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:
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
Post a Comment