November 16th, 2011

WCF | REST – Otra forma de ver URIs

Nicolás Parcerisa

 REST (Representational State Transfer) es un estilo de arquitectura de software para sistemas hipermedias distribuidos tales como la Web.

Estrictamente, REST se refiere a una colección de principios para el diseño de arquitecturas en red. Estos principios resumen como  los recursos son definidos y  diseccionados. Cualquier arquitectura de servicios distribuidos que cumpla con esta serie de requisitos puede ser considerada como una arquitectura REST.

En este post, veremos como implementar una solución REST utilizando para ello .NET Framework 4.0 y algunas librerías incluidas en el paquete WCF REST Starter Kit

Servicio REST

Para comenzar, vamos a crear un nuevo proyecto utilizando la opción de plantillas online la cual viene incorporada en nuestro VS2010. Para ello, seleccionamos “WCF Rest Service Application” como se muestra a continuación:

Al seleccionar nuestro template por primera vez, podremos observar el siguiente diálogo:

Seleccionamos “Install” y a continuación, estamos listos para comenzar a trabajar. Nuestro Solution Explorer debiera verse de la siguiente manera:

Lo primero que podemos observar en nuestra nueva solución, y a diferencia de un proyecto WCF tradicional es que:

  • No existe un archivo .svc asociado a nuestro servicio.
  • No existe una interface que define nuestro contrato.
  • El archivo web.config es más reducido dado que cuenta con menos opciones de configuración.
En REST .NET Framework 4 se simplifica mucho y aprovecha las capacidades de enrutamiento utilizadas en ASP.NET MVC y otros frameworks de la Web. Con REST .NET Framework 4 se utiliza el archivo global.asax para establecer la ruta del servicio a través de la nueva clase ServiceRoute. A partir de ahí el núcleo WCF maneja las llamadas al servicio basadas en templates de URIs.
Por lo tanto, nuestro servicio esta compuesto por los siguientes archivos:
  • Service1.cs: Este archivo proporciona una implementación vacía de la clase WCF WebHttp Service. La clase Service1 incluye operaciones decoradas con atributos como [WebGet] and [WebInvoke] para indicar los métodos HTTP como así también las URIs que mapean con dichos métodos.
  • SampleItem.cs: Este archivo proporciona una implementación del recurso que es utilizado por nuestro servicio. La clase SampleItem se serializa/deserializa como el body de nuestros mensajes HTTP.
  • Web.config: Este es un archivo estándar de configuración en proyectos web aunque en este caso con menos opciones de configuración dado que no son necesarias.
  • Global.asax: Es un archivo ASP.NET application el cual puede ser utilizado con servicios WCF WebHttp con el fin de registrar simples ASP.NET Routes para uno o más servicios.
Vamos a crear un simple servicio denominado “TimeService”, el cual devolverá la hora actual. Para ello comenzaremos renombrando la clase Service1 a TimeService para continuar modificando la misma hasta lograr que nuestra clase se vea como se muestra a continuación:

Configurando nuestro servicio

Al crear un nuevo proyecto web en Visual Studio, el proyecto se configura por defecto para utilizar puertos asignados al azar en nuestro servidor de desarrollo. Para simplificar nuestro ejemplo y permitir copiar y pegar URIs de este post sin necesidad de editar el puerto, vamos a configurar el servidor de desarrollo para utilizar un puerto específico. Para ello, debemos de realizar los siguientes pasos:

  1. En el “Solution Explorer” hacemos click derecho sobre nuestro proyecto y seleccionamos “Properties” en el menu contextual.
  2. Seleccionamos el tab “Web”
  3. Bajo la sección “Servers” seleccionamos “Specific Por” ingresando 8080 como puerto especifico y /TimeService como “Virtual Path”
  4. Abrimos el archivo Global.asax en el editor de código.
  5. En el método de RegisterRoutes (), reemplazamos la ruta ”Service1″con una cadena vacía.

Corriendo nuestro servicio

Al compilar y ejecutar el proyecto podremos levantar nuestro servicio el cual estará disponible en: http://localhost:8080/TimeService/. Para obtener la hora local, solo debemos de especificar la URI correcta como se muestra a continuación:

Otra característica muy útil son las páginas de ayuda. Para acceder a las páginas de ayuda en nuestro servicio, simplemente añadimos la palabra “help” al final de la URI base del servicio como se muestra a continuación:

Cliente REST

Para desarrollar nuestro cliente REST, vamos a crear un nuevo proyecto de consola como se muestra a continuación:

Ahora, debemos de cambiar la versión del framework utilizada por nuestra aplicación. Para ello, debemos de realizar los siguientes pasos:

  1. En el “Solution Explorer” hacemos click derecho sobre nuestro proyecto cliente y seleccionamos “Properties” en el menu contextual.
  2. Seleccionamos el tab “Application”
  3. Seleccionamos .NET Framework 4 como “Target framework”
La razón de ello es que la versión del framework “.NET Framework 4 Client Profile” no posee el set completo de librerías que debemos de utilizar. Así mismo, deberemos de agregar referencias externas a nuestro proyecto las cuales nos permitan utilizar classes derivadas de HTTPClient.
Existen muchas maneras de utilizar un servicio WCF WebHttp como el servicio TimeService. Podemos utilizar el WebChannelFactory de WCF, la clase HttpWebRequest, o incluso la clase WebClient. Sin embargo, se recomienda utilizar el HttpClient.
El HttpClient es parte de una biblioteca cliente que se incluye con el WCF Starter Kit Preview 2. Con el fin de utilizar el HttpClient vamos a descargar el WCF Starter Kit Preview 2 en donde se incluyen las librerías Microsoft.Http.dll y y Microsoft.Http.Extensions.dll las cuales serán utilizadas en nuestro cliente como se describe a continuación:
  1. Descargamos “WCF REST Starter Kit Preview 2″ desde: http://aspnet.codeplex.com/releases/view/24644
  2. En el “Solution Explorer” hacemos click derecho en el proyecto cliente y seleccionamos “Add Reference”. En la ventada de referencias, seleccionamos “Browse”  para luego buscar las librerías Microsoft.Http.dll y Microsoft.Http.Extensions.dll las cuales pueden ser encontradas en:  %ProgramFiles%\Microsoft WCF REST\WCF REST Starter Kit Preview 2\Assemblies
Una vez realizados todos estos pasos, nuestra solución debiera verse de la siguiente manera:
Ahora, modificamos nuestro archivo Program.cs de la siguiente manera:

Finalmente, al ejecutar nuestro programa de consola, obtenemos el siguiente resultado:

Podemos concluir entonces, que al desarrollar servicios REST, nuestras aplicaciones gozarán de las siguientes características:

  • Reutilizable: Ya que se se aprovecha de toda la infraestructura de la web ya existente. El cliente solo sabe que tiene que hacer la solucitud a la URL y recibir un documento como respuesta (XML, JSON, HTML, etc.) con la información pertinente al recurso. Como resultado de esto, es posible navegar de un recurso REST a muchos otros, simplemente siguiendo enlaces sin requerir el uso de registros u otra infraestructura adicional.
  • Simple: Cada recurso, cuenta con un conjunto de operaciones bien definidas. Entre las más importantes podemos destacar POST, GET, PUT y DELETE. Además, como vimos, no necesitamos de herramientas complejas, ni montones de código generado e inmantenible.
  • Sin Estado: cada mensaje HTTP contiene toda la información necesaria para comprender la petición. Como resultado, ni el cliente ni el servidor necesitan recordar ningún estado de las comunicaciones entre mensajes.
  • Autodescubrible: ya que no se necesita algo como un WSDL, Un sistema REST posee una sintaxis universal para identificar cada recurso. Por ejemplo: http://www.MiUrl.com/Entidad/23
Share Button

Dejar un comentario