Implementando un API REST en diferentes lenguajes

Clase 19 de 48Curso de Arquitectura de Aplicaciones con Docker 2018

La popularidad de los servicios web basados en REST se deben precisamente a la sencillez de su implementación; un lenguaje que tenga una implementación del protocolo HTTP es suficiente para crear servicios web; en algunos lenguajes es parte, además, de la biblioteca estándar.

Pero eso no significa que sea mejor usar una capa de abstracción adicional que permita trabajar con los diferentes componentes de un servicio web REST: rutas, middleware que haga procesamiento común para todas las rutas, registro de actividad o log, servir de forma eficiente página estáticas, y manejo de parámetros y payload de las peticiones REST.

Qué es una API RESTful

Durante la primera decena de este siglo se hicieron populares los marcos de desarrollo MVC como Django o Ruby on Rails. Estos marcos de desarrollo han sido diseñados para crear aplicaciones n-tier monolíticas, con una sola fuente de datos y una sola forma de generación de front-end a partir de plantillas.

Aunque son capaces de manejar rutas REST, es mejor usar framework específicos. Como son una versión “menor” de los frameworks, se suelen denominar: Microframeworks.

Microframeworks

Los microframeworks reúnen todas las características que se han indicado anteriormente y permiten, en general, que uno se concentre en la lógica de negocio programando el procesamiento común y el que hay que hacer en cada una de las rutas dejando que éste se encargue de pelar las cabeceras extrayendo la información y, por el contrario, construir la respuesta y enviarla al cliente.

Adicionalmente, para trabajar dentro del entorno de Docker tendremos que buscar alguna característica adicional, por ejemplo si tiene un contenedor oficial Docker y en qué estado está; una versión 0.x puede que lo haga interesante para experimentar o prototipos, pero es mejor buscar siempre versiones >=1 para algo que vaya a entrar en producción.

Un microservicio, por otro lado, se puede escribir en cualquier lenguaje. La arquitectura de microservicios es políglota y puede incluso contener diferentes microservicios que usen diferentes microframeworks en diferentes lenguajes.

El estado de desarrollo también merece la pena conocerlo buscando el número de pull requests abiertos que tiene en GitHub (y desde cuando) y el número de cambios que se han hecho últimamente. Un framework nunca es un trabajo completo, y confiar nuestra aplicación en producción a un framework que se ha dejado de desarrollar, aunque siendo software libre es algo que podemos hacer nosotros mismos, conviene que, si se puede elegir, se opte por otro que sí se mantenga en desarrollo continuo y tenga una hoja de ruta de desarrollo clara.

Por eso ponemos aquí algunos frameworks populares en diferentes lenguajes de scripting, aunque aconsejamos siempre y en todo momento, en el momento de comenzar a desarrollar, hacer una búsqueda rápida que nos revele cuales son los microframeworks más populares entre los desarrolladores en cada momento. Aunque eso no esté necesariamente correlacionado con la calidad, al menos estará relacionado con el tamaño de la comunidad a la que puedes acudir en caso de problemas con el mismo.

  • Perl: Dancer2
  • Javascript: Express.
  • Ruby: Sinatra, Cuba
  • Python: Hug, Flask

Conclusión

Antes incluso de convertir una arquitectura a microservicios, dividir de forma clara una aplicación entre un back-end que contiene un servicio web y un frontend que puede usar ese servicio web de diferentes formas (móvil, web, chatbots, clientes de escritorio) permite separar claramente interfaz de presentación y hacer pruebas e incluso despliegues de forma totalmente independiente. Los microframeworks son una forma fácil y rápida de programar microservicios, y todos los lenguajes populares tienen una serie de microframeworks en desarrollo con los que podemos pasar a producción nuestra aplicación, a través de Docker, de forma rápida y eficiente. En este curso hemos usado Hug y Flask, pero te animamos a que en el momento de decidirse por uno hagas prototipos con las diferentes opciones existentes para elegir la que más se adapte a tu problema y entorno de desarrollo.