Sunday, April 6, 2014

Creación de un Cliente para ServiceStack en C#

En la entrada anterior, creamos un servicio Saludo utilizando ServiceStack que permitía procesar cualquier verbo HTTP, recibir un nombre y devolver un saludo. También hicimos la prueba del mismo utilizando el verbo GET mediante el navegador. En esta entrada crearemos una aplicación de consola que, utilizando las librerías cliente de ServiceStack, nos permitirá interactuar con el servicio de forma fácil y cómoda, como si se tratara de una librería más.



Primero, realizaremos una pequeña refactorización, para la cual crearemos un nuevo proyecto de librería de clases sobre la solución anterior.



Moveremos nuestras clases Saludo y SaludoResponse a este nuevo proyecto, modificando sus namespaces. Nuestra estructura debe quedar así.

Quitaremos los atributos Route de la clase Saludo y añadiremos lo siguiente en el método Configure la clase Global.asax de nuestro proyecto de servicios.

                 Routes
                 .Add<Saludo>("/saludo")
                 .Add<Saludo>("/saludo/{Nombre}");

De esta forma, estamos cambiando la manera en que se realizan los enrutamientos del servicio para las urls REST, y despojando a la clase Saludo de esa responsabilidad. Notaremos que debemos recibir un error, por lo cual debemos referenciar al nuevo proyecto desde el anterior y añadir, a nuestra clase SaludoService y al Global.asax, la claúsula:

using ServiceStack.Requests;


Por último, también en la clase Saludo, implementaremos la interfaz IReturn<T> , con la que indicaremos que todo request hecho con esta clase, devolverá un response de tipo T (en nuestro caso, SaludoResponse). Esto, que no era necesario antes, nos servirá ahora para poder utilizar un cliente especializado para este request. Por lo tanto la clase Saludo deberá quedar así:

namespace ServiceStack.Requests
{
    public class Saludo:IReturn<SaludoResponse>
    {
        public string Nombre { get; set; }
    }
}

Nota: Para poder implementar IReturn, debemos referenciar la librería ServiceStack.References. Podemos hacerlo utilizando la .dll que bajamos mediante NuGet, o utilizando NuGet nuevamente para instalar ServiceStack en el proyecto de Requests (aunque no vayamos a utilizar todas sus dlls).

A continuación crearemos una nueva aplicación de consola. Añadiremos para ello un nuevo proyecto:


IMPORTANTE: Una vez creada la aplicación de consola, debemos entrar a las propiedades de dicho proyecto y asegurarnos de que el Target Framework sea: .NET Framework 4 y no su versión Client Profile. Aceptaremos cualquer adverntencia que nos muestre Visual Studio.



 Mediante NuGet, instalaremos en este proyecto el paquete ServiceStack.Client


A continuación, añadiremos nuestro proyecto de Requests como referencia de este nuevo proyecto.


A continuación dejo el código de la clase Program.cs explicado en sus comentarios.

using System;
using ServiceStack.Requests;

namespace ServiceStack.Cliente
{
    class Program
    {
        static void Main(string[] args)
        {
            // Declaramos el cliente a utilizar, indicamos la url base del servicio
            var client = new JsonServiceClient("http://localhost:5712/");

            // Variable de tipo SaludoResponse que nos devolverá el cliente
            SaludoResponse respuesta = client.Post(new Saludo() { Nombre = "Diego" });

            // Escribimos en consola la respuesta recibida
            Console.WriteLine(respuesta.Respuesta);
            Console.WriteLine("Presione cualquier tecla para terminar...");
            Console.ReadLine();
        }
    }
}

Un par de notas a rescatar:

  • He utilizado la clase JsonServiceClient, sin embargo podía haber utilizado la clase XmlServiceClient, o incluso las clases Soap11ServiceClient o Soap12ServiceClient. Estas clases se encargan de realizar la comunicación en el formato deseado, pero enmascaran todo el aspecto técnico referido a las comunicaciones.
  • Nótese que he utilizado el método POST, mientras que en el ejemplo de la entrada anterior utilicé el método GET mediante el uso del Browser. 
Este es el resultado al ejecutar la aplicación:


Cómo podemos apreciar, las librerías de ServiceStack nos ahorran mucho trabajo de configuración y codificación tanto en el lado servidor como en el lado cliente, gracias a la simplicidad de las mismas y a su uso de convenciones, lo que las hace ideales para servicios web sobre HTTP. Además, son versátiles en cuanto al uso de protocolos y eso las convierte en un fuerte competidor de WCF y WebAPI.

No comments:

Post a Comment