Esta publicacion es parte de una serie que estamos escribiendo con Jesse Liberty. El original (en ingles) se encuentra en su sitio.

En esta serie, exploraremos algunos topicos avanzados de Xamarin.Forms que han surgido en el trabajo con nuestros clientes.

Antes de empezar, necesitamos construir una API contra la que podamos programar. Idealmente, esta API soportara todas las operaciones CRUD y podra ser accedida en Azure.

Construyendo la API

En Visual Studio creamos una aplicacion ASP.Net Core, a la que llamaremos BookStore Cambiamos el nombre del controlador ValuesController a BookController. Agregamos un proyecto Bookstore.Dal (Data access layer), dentro del cual crearemos dos carpetas: Domain y Repository.

Instalamos el paquete Nuget para LiteDB una base de datos NoSql. En la carpeta Repository, creamos un archivo BookRepository.cs. En dicho archivo inicializaremos LiteDB y crearemos una coleccion para contener nuestros libros.

    public class BookRepository
    {
        private readonly LiteDatabase _db;
        public BookRepository()
        {
            _db = new LiteDatabase("bookstore.db");
            Books.EnsureIndex(x => x.BookId);
        }

Si el archivo bookstore.db no existe, sera creado. De la misma manera, si el indice no existe, tambien sera creado.

En las referencias del proyecto API, utilizando el menu contextual, agregaremos una referencia a nuestro proyecto Bookstore.dal. En nuestro controlador BookstoreController, agregaremos las sentencias using para referenciar Bookstore.Dal.Domain y Bookstore.Dal.Repository. Crearemos una instancia de BookRepository en el controlador y lo inicializaremos.

   public class BooksController : ControllerBase
   {
      private BookRepository _bookRepository;

      public BooksController()
      {
         _bookRepository = new BookRepository();
      }

Creando el objeto libro

Por ahora necesitaremos un objeto libro muy sencillo, para enviar y recibir la informacion a nuestro repositorio y base de datos. Comenzamos creando el objeto (sientanse libres de agregar cualquier campo que quieran)

  public class Book
   {
      public Book()
      {
         BookId = Guid.NewGuid().ToString();
      }

      public string BookId { get; set; }
      public string ISBN { get; set; }
      public string Title { get; set; }
      public List<Author> Authors { get; set; }
      public double ListPrice { get; set; }
   }

Libro tiene una lista de Autores, vamos a crear dicha clase, tambien manteniendola muy sencilla.

   public class Author
   {
      public string AuthorId { get; set; }
      public string Name { get; set; }
      public string Notes { get; set; }
   }

El Repositorio

Volvamos al repositorio. Anteriormente inicializamos la base de datos, ahora vamos a crear los metodos.

Iniciamos con la creacion de la conexion de nuestra lista de libros a la tabla de la base de datos.

    public LiteCollection<Book> Books => _db.GetCollection<Book>();

Luego nuestros metodos basicos: get, insert, update, delete:

    public IEnumerable<Book> GetBooks()
    {
        return Books.FindAll();
    }

    public void Insert(Book book)
    {
        Books.Insert(book);
    }

    public void Update(Book book)
    {
        Books.Update(book);
    }

    public void Delete(Book book)
    {
        Books.Delete(book.BookId);
    }

Conectando a la API

Ya estamos listos para crear nuestros metodos CRUD en la API y conectarlos al repositorio.

      [HttpGet]
      public ActionResult<IEnumerable<Book>> Get()
      {
         var books = _bookRepository.GetBooks();
         return new 
              ActionResult<IEnumerable<Book>>(books);
      }

Esto devolvera la informacion obtenida al metodo que llama. Por el momento no filtrara informacion, y devolvera todos los libros.

Creemos ahora el metodo POST.

      [HttpPost]
      public void Post([FromBody] Book book)
      {
         _bookRepository.Insert(book);
      }

Pruebas

Para verificar que podemos obtener informacion, crearemos una coleccion en Postman. Iniciamos la aplicacion de escritorio(la extension de Chrome a sido discontinuada). En dicha coleccion podemos ver que tenemos acceso a nuestros metodos de API. Agregamos un libro utilizando el metodo POST con JSON, estableciendo el header al tipo application/json, y en el body utilizamos:

    {"Title":"Ulyses"}

Al seleccionar Send, enviaremos la informacion a nuestra base de datos. Para asegurarnos que se encuentra alli, pasamos al metodo get y al utilizar Send, veremos que devuelve nuestro objeto recien creado.

    [
        {
            "bookId": "d4f8fa63-1418-4e06-8c64-e8408c365b13",
            "isbn": null,
            "title": "Ulyses",
            "authors": null,
            "listPrice": 0
        }
    ]

Azure

El siguiente paso es mover nuestra API a Azure. Es mas sencillo de lo que parece.

Primero, vamos al sitio de Azure y seleccionamos el boton de “Start Free”

Image

Creamos una cuenta con nuestra dicreccion de correo y luego de confirmala, estamos listos para usar nuestra nueva cuenta desde Visual Studio.

Luego publicamos la API, seleccionando la opcion publicar del menu contextual en el explorador de soluciones y seguimos estos pasos:

Image

Image

Mientras estamos creando el App Service a ser usado en nuestro Hosting Plan, podemos seleccionar la capa gratuita.

Image

Luego de que la publicacion se ha completado, tendremos acceso a la API en el endpoint recien creado, en nuestro ejemplo el endpoint es https://bookstoreapiblogpost.azurewebsites.net/ Podemos testear nuestro nuevo endpoint en Postman y luego usarlo en nuestro proyectos.

Source Code Repository

Por Jesse Liberty (Massachusetts US) y Rodrigo Juarez (Mendoza, Argentina)


Image

Acerca de Jesse Liberty

Jesse Liberty es Principal Mobile Developer en IFS Core. Tiene tres decadas de experiencia escribiendo y creando proyectos de software. Es el autor de 2 docenas de libros y el creador de algunas decenas de cursos de aprendizaje en Pluralsight y LinkedIn Learning y ha sido Senior Technical Evangelist para Microsoft, Distinguished Software Engineer para AT&T, VP para Information Services en Citibank y Software Architect para PBS. Es un Desarrollador Certificado Xamarin, Xamarin MVP y Microsoft MVP.