Mostrando las entradas con la etiqueta Xamarin. Mostrar todas las entradas

Consumo de servicio REST

Visual Studio En estos días, escuchamos por todos lados hablar de consumir servicios REST, el cual, se maneja a través de un protocolo muy conocido: HTTP. Esto hace que REST sea mucho más utilizado que un servicio ASMX (con protocolo SOAP). ¿Cuál prefieres?

Con la plataforma .NET, podemos crear de manera muy sencilla una WEB API que exponga los servicios REST a través del protocolo HTTP, escribiendo muy poco código. Esto escapa del objetivo de este artículo.

Para comenzar necesitamos un servicio REST publicado (vía internet o de manera local). Para este ejemplo, utilizaremos un servicio web que se encuentra disponible en la Web (al momento de escribir esta entrada el servicio se encuentra funcionando). La dirección es: http://www.groupkt.com/post/c9b0ccb9/country-and-other-related-rest-webservices.htm

En este ejemplo, necesitamos el parámetro de dos caracteres que corresponde al código del país (por ejemplo PY) y mostraremos el resultado en un Toast.

Si realizamos una prueba de servicio (pasando como parámetro PY) lo haríamos utilizando esta URL y el resultado (en formato JSON) sería:
{
  "RestResponse" : {
    "messages" : [ "More webservices are available at http://www.groupkt.com/post/f2129b88/services.htm", "Country found matching code [PY]." ],
    "result" : {
      "name" : "Paraguay",
      "alpha2_code" : "PY",
      "alpha3_code" : "PRY"
    }
  }
}
El diseño de la aplicación lo presentaremos de esta manera, en el archivo Main.axml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="Código: "
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1" />
    <EditText
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/codigo" />
    <Button
        android:text="Averiguar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnAveriguar" />
</LinearLayout>

¿Cómo agregar el servicio?

En este tipo de servicio no es necesario agregar referencia como lo hacíamos con los servicios ASMX, aquí se puede utilizar la clase HttpWebRequest que permite el acceso vía HTTP y obtener el resultado. A continuación se ve dicha acción en el evento btnAveriguar_Click.

Consumo del servicio

Aquí el servicio se consume de manera directa y se espera por el resultado. La clase MainActivity.cs quedaría de la siguiente manera:
using Android.App;
using Android.Widget;
using Android.OS;

namespace ServicioRest
{
    [Activity(Label = "ServicioRest", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        EditText codigo;
        Button btnAveriguar;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            codigo = FindViewById<EditText>(Resource.Id.codigo);
            btnAveriguar = FindViewById<Button>(Resource.Id.btnAveriguar);

            btnAveriguar.Click += btnAveriguar_Click;
        }

        private void btnAveriguar_Click(object sender, System.EventArgs e)
        {
            //Creamos la URL pasando como parámetro el código de país. Ej: PY, AR, US, ES, MX, etc.
            var url = string.Format("http://services.groupkt.com/country/get/iso2code/{0}", codigo.Text);

            //Creamos la solicitud HTTP.
            var webrequest = (HttpWebRequest)System.Net.WebRequest.Create(url);

            //Realizamos la llamada al servicio a través del protocolo HTTP.
            using (var response = webrequest.GetResponse())
            {
                //Obtenemos los datos proveídos por el servicio a través del protocolo HTTP.
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    //Obtenemos el resultado retornado por el servicio
                    var resultado = reader.ReadToEnd();

                    //Mostramos el JSON en el Toast.
                    Toast.MakeText(this.BaseContext, resultado.ToString(),
                        ToastLength.Long).Show();
                }
            }
        }
    }
}
De esta manera, consumimos un servicio REST para utilizarlo en nuestra aplicación Xamarin.

Cargar ListView desde una lista genérica

Visual Studio Cuando trabajamos con servicios Web, generalmente éste retorna listas con datos relacionados al tipo de dato que necesitamos para poder trabajar con dichos datos.

Supongamos que tenemos un servicio Web para una biblioteca donde tenemos la lista de libros y deseamos cargar dichos libros en nuestra vista dentro de la aplicación Xamarin. ¿Cómo lo hacemos?

Consumo de servicio ASMX con Xamarin

Visual Studio Uno de los servicios más conocidos y utilizados en el mundo .NET es el servicio ASMX (utilizando el protocolo SOAP), si bien es cierto esta forma de crear servicios ha quedado obsoleta (más bien, reemplazada por otras nuevas) se sigue utilizando en nuestros días.

Resulta sencilla su creación y consumo, pero tiene algunos problemas de autenticación propias del protocolo SOAP. En esta entrada mostraré cómo consumir un servicio web SOAP desde una aplicación Xamarin.Android.

Para comenzar necesitamos un servicio web SOAP publicado (vía internet o de manera local). Para este ejemplo, utilizaremos un servicio web que se encuentra disponible en la Web (al momento de escribir esta entrada el servicio se encuentra funcionando). La dirección es: http://www.dneonline.com/calculator.asmx

Como verás es una calculadora, por lo cual, necesitaremos 2 número para realizar el cálculo y mostrar el resultado en un Toast.

El diseño de la aplicación lo presentaremos de esta manera, en el archivo Main.axml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="Primer número"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1" />
    <EditText
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/num1" />
    <TextView
        android:text="Segundo número"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/num2" />
    <Button
        android:text="Sumar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSumar" />
</LinearLayout>

Llamada Sincrónica

Aquí el servicio se consume de manera directa y se espera por el resultado. La clase MainActivity.cs quedaría de la siguiente manera:
using Android.App;
using Android.Widget;
using Android.OS;

namespace PruebaServicioWeb
{
    [Activity(Label = "PruebaServicioWeb", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        EditText num1;
        EditText num2;
        Button btnSumar;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            num1 = FindViewById<EditText>(Resource.Id.num1);
            num2 = FindViewById<EditText>(Resource.Id.num2);
            btnSumar = FindViewById<Button>(Resource.Id.btnSumar);

            btnSumar.Click += BtnSumar_Click;
        }

        private async void BtnSumar_Click(object sender, System.EventArgs e)
        {
            //Llamar al servicio web
            var proxy = new ServicioWeb.Calculator();
            int n1, n2, resultado;
            n1 = int.Parse(num1.Text);
            n2 = int.Parse(num2.Text);
                
            //Realizamos la llamada al método del servicio web
            resultado = proxy.Add(n1, n2);
            Toast.MakeText(this.BaseContext, resultado.ToString(),
                        ToastLength.Long).Show();
        }
    }
}

Llamada Asincrónica

Aquí el servicio se consume de manera directa y el resultado se retorna cuando esté disponible. La clase MainActivity.cs quedaría de la siguiente manera:
using Android.App;
using Android.Widget;
using Android.OS;

namespace PruebaServicioWeb
{
    [Activity(Label = "PruebaServicioWeb", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        EditText num1;
        EditText num2;
        Button btnSumar;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);

            num1 = FindViewById<EditText>(Resource.Id.num1);
            num2 = FindViewById<EditText>(Resource.Id.num2);
            btnSumar = FindViewById<Button>(Resource.Id.btnSumar);

            btnSumar.Click += BtnSumar_Click;
        }

        private async void BtnSumar_Click(object sender, System.EventArgs e)
        {
            //Llamar al servicio web
            var proxy = new ServicioWeb.Calculator();
            int n1, n2;
            n1 = int.Parse(num1.Text);
            n2 = int.Parse(num2.Text);
                
            //Crear llamada al método asincrónico para sumar.
            proxy.AddAsync(n1, n2);
            
            // Evento que espera por el resultado
            proxy.AddCompleted += Proxy_AddCompleted;
        }
        
        private void Proxy_AddCompleted(object sender, 
                ServicioWeb.AddCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                int resultado = e.Result;
                Toast.MakeText(this.BaseContext, resultado.ToString(),
                        ToastLength.Long).Show();
            }
        }
    }
}
De esta manera, consumimos de dos maneras distintas un servicio web SOAP para utilizarlo en nuestra aplicación Xamarin.

Traspaso de valores de un Activity a otro

Visual Studio Para explicarlo de una manera sencilla y rápida un Activity es algo que el usuario puede ver o hacer en su dispositivo móvil. Básicamente, estamos hablando de la interfaz de usuario que se está presentando en ese momento.

Para mayor información, puedes ir al sitio oficial de Desarrollo sobre Android.

En este pequeño tutorial, mostraré cómo pasar valores de un Activity a otro de manera a poder utilizarlo y realizar ciertas acciones dentro de él

[Xamarin - How To] Instalar Xamarin con Visual Studio 2015

Visual Studio

Introducción

Estamos decididos a desarrollar para dispositivos móviles, tenemos las ganas, las herramientas y cierto conocimiento para poder empezar en este mundo del desarrollo. Si ingresamos al sitio oficial de Xamarin, encontramos un tutorial para realizar dicha instalación. Pero, en la vida real no es tan sencilla la instalación de esta plataforma con el Visual Studio, 2015 en este caso.

Es por eso, que en este tutorial explicaré cómo instalar Xamarin con Visual Studio 2015, los posibles errores que se puedan encontrar y cómo solucionarlos. Obviamente, lo ideal es realizar todas estas tareas con una cuenta de Administrador dentro del sistema operativo.

[How To] Instalar Visual Studio 2015 + Android

Visual Studio

Introducción

En versiones anteriores a Visual Studio 2015 resultaba complicado desarrollar para Android, pues debías instalarte algún plug-in por ahí para poder utilizarlo o definitivamente debías instalarte el Android Studio para poder desarrollar aplicaciones Android, con el lenguaje Java.

Con Visual Studio 2015+ (el signo mas indica 2015 o superior) eso es cosa del pasado, ya que éste permite el desarrollo multiplataforma y podemos instalarnos la suite completa de Xamarin desde el propio instalador de Visual Studio 2015+. Simplemente, seleccionamos las opciones requeridas y ¡listo!