jueves, 3 de abril de 2014

Consumir Rest Service con RestSharp y Xamarin.Android

El día de hoy les traigo un pequeño ejemplo de como consumir un Rest Service desde una aplicación Android creada en Xamarin Studio y utilizando el componente RestSharp para consumir los servicios de una manera mas sencilla.

Comenzamos creando un nuevo proyecto


Luego vamos a crear un Activity por cada metodo que vamos a utilizar en nuestro caso solo utilizaremos
los metodos de GET,POST,DELETE.




Ahora creamos un layout por cada metodo para asi  mostrar cada metodo en Tabs.


Comenzamos añadiendo el componente de RestSharp, vamos a la carpeta de Components y descargamos  el componente y lo agregamos a nuestro proyecto.


Ahora si vamos comenzar con el codigo y empezamamos con el codigo del MainActivity.cs donde solo vamos a crear las tabs para cada metodo que vamos a utilizar.


//LIBRERIAS
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Net.Http;
using System.Collections.Generic;

using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
using System.Json;
using System.IO;
//Hacemos referencia  RestSharp
using RestSharp;

namespace Aplicacion1
{
 [Activity (Label = "Aplicacion1", MainLauncher = true)]
 //Cambiamos Activity por TabActivity para crear nuestras Tabs
 public class MainActivity : TabActivity
 {



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

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

   //Mandamo llamar a  nuestro metodo que crea las tabs y pasamos los parametros
   CreateTab(typeof(GET), "Metodo Get", "Metodo Get", Resource.Drawable.Icon);
   CreateTab(typeof(POST), "Metodo Post", "Metodo Post", Resource.Drawable.Icon);
   CreateTab(typeof(DELETE), "Metodo Delete", "Metodo Delete", Resource.Drawable.Icon);


  }
  //Este metodo es el que nos crea las tabs
  private void CreateTab(Type activityType, string tag, string label, int drawableId )
  {
   var intent = new Intent(this, activityType);
   intent.AddFlags(ActivityFlags.NewTask);

   var spec = TabHost.NewTabSpec(tag);
   var drawableIcon = Resources.GetDrawable(drawableId);
   spec.SetIndicator(label, drawableIcon);
   spec.SetContent(intent);

   TabHost.AddTab(spec);
  }
 }
 //Entidad de los datos que vamos a usar.
 public class Datos_Usuarios
 {
  public int Id_Persona { get; set; }
  public string Nombre { get; set; }
  public string Paterno { get; set; }
  public string Materno { get; set; }
  public string Telefono { get; set; }
  public string Email { get; set; }
  public string Direccion { get; set; }
  public double Edad { get; set; }
 }

}
Ahora vamos al Metodo GET donde vamos a obtener todos los datos que nos va a regresar nuestro servicio desde una base de datos.


//Librerias
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
//Libreria Restsharp
using RestSharp;

namespace Aplicacion1
{
 [Activity (Label = "GET")]   
 public class GET : Activity
 {
  //Declaroamos nuestras variables que utilizaremos
  public ArrayAdapter&ltDatos_Usuarios&gt adapter;
  //declaremos nuestro cliente
  public RestClient cliente;
  List<Datos_Usuarios> listausuarios = new List<Datos_Usuarios> ();
 Button BtnMostrarDatos ;
  ListView LvLIsta;

  protected override void OnCreate (Bundle bundle)
  {
   base.OnCreate (bundle);
   //seleccionamos nuestro layout GET 
   SetContentView (Resource.Layout.Get);

   BtnMostrarDatos = FindViewById<Button> (Resource.Id.button1);
   LvLIsta = FindViewById<ListView> (Resource.Id.listView1);
   //asignamos la direccion de nuestro servicio
   cliente = new RestClient ("http://192.168.1.73:83");
   //declaramos nuestro adaptador para llenar nuestro listview
   adapter = new ArrayAdapter<Datos_Usuarios>(this, Android.Resource.Layout.SimpleListItem1);
   LvLIsta.Adapter = adapter;
   MetodoGet ();
   BtnMostrarDatos.Click += (object sender, EventArgs e) => 
   {

    listausuarios = new List<Datos_Usuarios>();
    MetodoGet();

   };
   //declaramos el evento de click en listview para mostrar informacion extra en un toast
   LvLIsta.ItemClick += lvlista_ItemClick;
   // Create your application here
  }

  void lvlista_ItemClick (object sender, AdapterView.ItemClickEventArgs e)
  {
   //toast para mostrar informacion extra de la mostrada
   Android.Widget.Toast.MakeText(this, listausuarios[e.Position].Email + " " + listausuarios[e.Position].Telefono, Android.Widget.ToastLength.Short).Show();
  }

  public void MetodoGet()
  {
   //limpiamos nuestro adaptador
   adapter.Clear ();
   //hacemos nuestro request donde declaramos que metodo vamos a utilizar
   var request = new RestRequest ("api/Datos_Usuarios",Method.GET);
   //ejecutamos el metodo para que nos devuelva todo la informacion y la mostramos en nuestro listview
   var resultado = cliente.Execute<List<Datos_Usuarios>>(request).Data;
   foreach (Datos_Usuarios x in resultado) {
    Datos_Usuarios datos = new Datos_Usuarios ();
    datos.Id_Persona = x.Id_Persona;
    datos.Nombre = x.Nombre;
    datos.Paterno = x.Paterno;
    datos.Materno = x.Materno;
    datos.Telefono = x.Telefono;
    datos.Email = x.Email;
    datos.Direccion = x.Direccion;
    datos.Edad = x.Edad;
    adapter.Add (x.Nombre + " " + x.Paterno + " " + x.Materno) ;
    listausuarios.Add (datos);
   }
  }
   
 }
}
A continuación seguimos con nuestro método POST que es con el que insertaremos registros a nuestra base de datos a través del servicio.
//Librerias
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

using RestSharp;

namespace Aplicacion1
{
 [Activity (Label = "POST")]   
 public class POST : Activity
 {
  //Variables
  public RestClient cliente;
  EditText txtnombre;
  EditText txtpaterno;
  EditText txtmaterno;
  EditText txttelefono;
  EditText txtemail;
  EditText txtdireccion;
  Button btnguardar;
  string nombre,paterno,materno,telefono,email,direccion;

  protected override void OnCreate (Bundle bundle)
  {
   base.OnCreate (bundle);
   //Asignamos el layout Post
   SetContentView (Resource.Layout.Post);

   txtnombre = FindViewById<EditText> (Resource.Id.editText1);
   txtpaterno = FindViewById<EditText> (Resource.Id.editText2);
   txtmaterno = FindViewById<EditText> (Resource.Id.editText3);
   txttelefono = FindViewById<EditText> (Resource.Id.editText4);
   txtemail = FindViewById<EditText> (Resource.Id.editText5);
   txtdireccion = FindViewById<EditText> (Resource.Id.editText6);
   btnguardar = FindViewById<Button> (Resource.Id.button1);
   //asignamos la direccion de nuestro servicio
   cliente = new RestClient ("http://192.168.1.73:83");
   //declaramos el evento a nuestro boton para guardar los datos
   btnguardar.Click += (object sender, EventArgs e) =&gt {
    //Asignamos el valor de nuestras variables
    nombre = txtnombre.Text;
    paterno = txtpaterno.Text;
    materno = txtmaterno.Text;
    telefono = txttelefono.Text;
    email= txtemail.Text;
    direccion = txtdireccion.Text;
    //mandamos llamar el metodo post
    MetodoPost(nombre,paterno,materno,telefono,email,direccion);
   };
   // Create your application here
  }
  public void MetodoPost(string nombre,string paterno, string materno,string telefono,string email,string direccion){

   Datos_Usuarios usuarios = new Datos_Usuarios ();
   
   usuarios.Nombre = nombre;
   usuarios.Paterno = paterno;
   usuarios.Materno = materno;
   usuarios.Telefono = telefono;
   usuarios.Email = email;
   usuarios.Direccion = direccion;
   usuarios.Edad = 23;
   //hacemos el request del metodo que POST para guardar los datos
   var request = new RestRequest("api/Datos_Usuarios", Method.POST);
   //asignamos el valor de nuestros datos puede ser en XML O JSON en nuestro caso usaremos json
   request.RequestFormat = DataFormat.Json;
   //agregamos la entidad con los valores asignado anteriormente
   request.AddBody(usuarios);
   //ejecutamos el request
   cliente.Execute (request);

   //limpiamos los campos
   txtnombre.Text = "";
   txtpaterno.Text = "";
   txtmaterno.Text = "";
   txttelefono.Text = "";
   txtemail.Text = "";
   txtdireccion.Text = "";

   AlertDialog.Builder dialogo = new AlertDialog.Builder (this);
   AlertDialog men = dialogo.Create();
   men.SetTitle ("Metodo Post");
   men.SetMessage ("Guardado Correctamente");
   men.Show ();

  }
 }
}
Y finalmente nuestro Metodo DELETE para eliminar registros de la base de datos.

//Librerias
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using RestSharp;

namespace Aplicacion1
{
 [Activity (Label = "DELETE")]   
 public class DELETE : Activity
 {
  //Variables
  public ArrayAdapter<Datos_Usuarios> adapter;
 public RestClient cliente;
  List<Datos_Usuarios> listausuarios = new List<Datos_Usuarios> ();
 ListView LvLIsta;
  Button btndatos;
  int id ;
  protected override void OnCreate (Bundle bundle)
  {
   base.OnCreate (bundle);
   //seleccionamos layout DELETE
   SetContentView (Resource.Layout.Delete);
   LvLIsta = FindViewById<ListView> (Resource.Id.listView1);
  btndatos = FindViewById<Button> (Resource.Id.button1);
 //Declaramos nuestro cliente
   cliente = new RestClient ("http://192.168.1.73:83");
   //inicializamos nuestro adaptador
   adapter = new ArrayAdapter<Datos_Usuarios>(this, Android.Resource.Layout.SimpleListItem1);
LvLIsta.Adapter = adapter;
   MetodoGet ();
   LvLIsta.ItemClick += lvlista_ItemClick;
   btndatos.Click += btndatos_Click;
   // Create your application here
  }

  void btndatos_Click (object sender, EventArgs e)
  {
   MetodoGet ();
  }

  void lvlista_ItemClick (object sender, AdapterView.ItemClickEventArgs e)
  {
   //creamos un dialogo y agregamos 2 botones el de eliminar y el de aceptar
   AlertDialog.Builder dialogo = new AlertDialog.Builder (this);
   AlertDialog men = dialogo.Create();
   men.SetTitle ("Metodo Delete");
   men.SetMessage ("Seguro que desea eliminar el registro");
   men.SetButton ("Aceptar",delegate(object send, DialogClickEventArgs er) {
    id= listausuarios[e.Position].Id_Persona;
    MetodoDelete();
    listausuarios.RemoveAt(e.Position);
   });
   men.SetButton2("Cancelar",delegate(object sende, DialogClickEventArgs em) {

   });
   men.Show ();
  }
  public void MetodoDelete()
  {
   //creamos nuestro request con el metodo delete y pasamos el id del registro a eliminar
   var request = new RestRequest("api/Datos_Usuarios/{id}", Method.DELETE);
   //agregamos parametros
   request.AddParameter("id",id);
   //ejecutamos el request
   cliente.Execute (request);
   //llamamos el metodo get para actualizar el listview
   MetodoGet ();
  }

  public void MetodoGet()
  {
   //limpiamos nuestro adaptador
   adapter.Clear ();
   //hacemos nuestro request donde declaramos que metodo vamos a utilizar
   var request = new RestRequest ("api/Datos_Usuarios",Method.GET);
   //ejecutamos el metodo para que nos devuelva todo la informacion y la mostramos en nuestro listview
   var resultado = cliente.Execute<Listlt;Datos_Usuarios>>(request).Data;
foreach (Datos_Usuarios x in resultado) {
    Datos_Usuarios datos = new Datos_Usuarios ();
    datos.Id_Persona = x.Id_Persona;
    datos.Nombre = x.Nombre;
    datos.Paterno = x.Paterno;
    datos.Materno = x.Materno;
    datos.Telefono = x.Telefono;
    datos.Email = x.Email;
    datos.Direccion = x.Direccion;
    datos.Edad = x.Edad;
    adapter.Add (x.Nombre + " " + x.Paterno + " " + x.Materno) ;
    listausuarios.Add (datos);
   }
  }
 }
}
Este fue todo y solo fue un pequeño ejemplo de como consumir servicios Rest utilizando el componente de xamarin RestSharp.

 Acepto cualquier tipo de Comentario, Queja o Sugerencia.

 referencias:
http://restsharp.org/
http://components.xamarin.com/view/restsharp

3 comentarios:

  1. Buen dia Ricardo, tienes el ejemplo de los servicios.
    Saludos.

    ResponderEliminar
  2. hola amigo

    no entiendo y no veo de donde sacas " =&gt" no veo en donde lo creas o que es gracias por tu aporte muy valioso


    btnguardar.Click += (object sender, EventArgs e) =&gt {
    //Asignamos el valor de nuestras variables
    nombre = txtnombre.Text;
    paterno = txtpaterno.Text;
    materno = txtmaterno.Text;
    telefono = txttelefono.Text;
    email= txtemail.Text;
    direccion = txtdireccion.Text;
    //mandamos llamar el metodo post
    MetodoPost(nombre,paterno,materno,telefono,email,direccion);
    };


    esta en esta linea y me gustaria que me ayudaras gracias

    ResponderEliminar
  3. hola amigo

    no entiendo y no veo de donde sacas " =&gt" no veo en donde lo creas o que es gracias por tu aporte muy valioso


    btnguardar.Click += (object sender, EventArgs e) =&gt {
    //Asignamos el valor de nuestras variables
    nombre = txtnombre.Text;
    paterno = txtpaterno.Text;
    materno = txtmaterno.Text;
    telefono = txttelefono.Text;
    email= txtemail.Text;
    direccion = txtdireccion.Text;
    //mandamos llamar el metodo post
    MetodoPost(nombre,paterno,materno,telefono,email,direccion);
    };


    esta en esta linea y me gustaria que me ayudaras gracias

    ResponderEliminar