Consumo de servicio REST

julio 24, 2017 Christian Amado 0 Comentarios

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.

0 comentarios: