Crear un Servidor Web Basico Con Clojure Usando http-kit y compojure

Share this video with your friends

Social Share Links

Send Tweet
Published 3 years ago
Updated 3 years ago

Clojure permite crear un servidor web robusto y listo para soportar concurrencia de forma rápida y simple. Podemos utilizar dos librerías populares para esto:

  • http-kit es librería para construir clientes/servidores HTTP compatibles con la arquitectura Ring y que soporta concurrencia via manejo de eventos.
  • compojure Una librería para routing compatible con Ring basada en macros.

Gracias al poderoso sistema de macros de Clojure, crear rutas para un sistema CRUD es sencillo y fácil de entender.

Instructor: [0:00] Crearemos un pequeño servidor web utilizando dos librerías bastante populares. Este HTTP Kit que provee de las funcionalidades del servidor y Compojure para el manejo de rutas. Utilizaremos Leiningen como herramienta para crear y manejar el proyecto. Esta es la herramienta más utilizada, casi estándar.

[0:17] Para crear la aplicación en la terminal, iniciamos Leiningen con simplemente lein new template app y el nombre de nuestra aplicación que simplemente será simplemente "server". Una vez finalizado el proceso, podemos ver dentro del directorio server un listado de archivos.

[0:33] Primero agregaremos nuestras dependencias en el archivo project.clg. En este podemos ver que hay dos variables FIXME que son básicamente para definir nuestra descripción. BeerJS server. Y aquí podemos definir nuestras dependencias.

[0:50] Primero, agregaremos http-kit en su versión 2.3., y la librería compojure, su versión 1.6.1. Ahora nos podemos enfocar en el código que está dentro de nuestro archivo core.clg.

[1:06] Lo primero que podemos ver aquí en nuestro name space que define nuestro módulo, lo primero es requerir o importar la librería de server. Para eso utilizaremos el símbolo require org.httpkit.server y agregaremos el alias server.

[1:25] Ahora en la función principal simplemente definiremos utilizando let, un puerto que leeremos desde las variables de ambiente llamada PORT o un valor que definimos nosotros de 8080, e iniciaremos el servidor utilizando un server que recibe una función inicial y un puerto proveniente del anterior. Finalmente, simplemente utilizaremos este println que es un console log para mostrar que se está ejecutando el servidor en localhost con el puerto 8080.

[2:07] Ahora simplemente nos queda definir esta función "baby-steps" para lo que utilizaremos defn baby-steps que recibe un vector con un parámetro llamado "req" y retornará simplemente un mapa con el estado 200, unas cabeceras que simplemente dicen que será "Content-type", "text/html". Y un body que nos muestra un "Hola mundo desde el servidor."

[2:37] Typo, volvamos.

[2:38] Volvemos a nuestra consola lein run y nuestro servidor está ejecutándose en localhost. Podemos verlo en localhost8080.

[2:47] Recuerden que utilizamos una variable de ambiente. Vamos a hacer que sea el puerto 6060, lein run. No está aquí, sino que está ahora ejecutándose en 6060.

[3:00] Ahora agregaremos algo de routing. Primero, importamos la librería compojure y su namespace core y también su namespace route, al que nos referiremos como route. Ahora crearemos una función para definir nuestras rutas utilizando "defroutes" proveniente de las macros de compojure, y le llamaremos app-routes.

[3:23] Usaremos otras macros definidas por compojure para definir cada ruta. Cada ruta GET al route que ejecutará la función get-handler. Otra ruta POST en /post que ejecutará la función post-handler, y finalmente una ruta con error 404.

[3:43] Cambiamos ésta llamada a baby-steps como entrada inicial le pasamos nuestra función app-routes. Tenemos que definir ahora nuestras funciones get-handler y post-handler que también recibe un argumento llamado req.

[4:01] En el caso de get-handler, es idéntica a nuestra función baby-steps, así que simplemente la vamos a renombrar. Y nuestra función post-handler será muy similar a get-handler, en este caso para el ejemplo, pero retornaremos en vez de un Content-Type html luego tenemos json y aprovecharemos de utilizar una función que llamaremos json-response.

[4:29] También tenemos que crear defn jason-response, no recibe ningún argumento, que va a retornar un json bastante manual por ahora que dice, "Saludos BeerJS". Guardamos.

[4:46] Ejecutamos nuestro servidor. Volvemos a nuestro navegador. Tenemos nuestra ruta get y podemos verificar nuestro post utilizando una llamada a fetch. Y podemos probar nuestra ruta post utilizando un poquito de JavaScript en la consola. Creamos una función post que simplemente hace uso de la [inaudible] fetch.

[5:10] Simplemente la ejecutamos y tenemos nuestra "Saludos desde BeerJS". Tratamos de probar nuestra ruta 404. Perfecto.

[5:19] En resumen, [inaudible] ofrece suficientes herramientas y un poderoso sistema de macros para crear rápidamente un servidor web con diferentes rutas para implementar un sistema CRUD.

egghead
egghead
~ 8 minutes ago

Member comments are a way for members to communicate, interact, and ask questions about a lesson.

The instructor or someone from the community might respond to your question Here are a few basic guidelines to commenting on egghead.io

Be on-Topic

Comments are for discussing a lesson. If you're having a general issue with the website functionality, please contact us at support@egghead.io.

Avoid meta-discussion

  • This was great!
  • This was horrible!
  • I didn't like this because it didn't match my skill level.
  • +1 It will likely be deleted as spam.

Code Problems?

Should be accompanied by code! Codesandbox or Stackblitz provide a way to share code and discuss it in context

Details and Context

Vague question? Vague answer. Any details and context you can provide will lure more interesting answers!

Markdown supported.
Become a member to join the discussionEnroll Today