Compojure ya no es un marco completo para desarrollar aplicaciones web. Desde la versión 0.4, el componente se ha dividido en varios proyectos.
Ring proporciona la base al abstraer la solicitud HTTP y el proceso de respuesta. Ring analizará la solicitud entrante y generará un mapa que contiene todas las partes de la solicitud, como uri, nombre del servidor y método de solicitud. La aplicación manejará la solicitud y, en función de la solicitud, generará una respuesta. Una respuesta se representa como un mapa que contiene las siguientes claves: estado, encabezados y cuerpo. Entonces una aplicación simple se vería así:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Otra parte de Ring es el concepto de middleware. Este es el código que se encuentra entre el controlador y la solicitud entrante y / o la respuesta saliente. Algunos construidos en middleware incluyen sesiones y stacktrace. El middleware de la sesión agregará: clave de sesión al mapa de solicitud que contiene toda la información de la sesión para el usuario que realiza la solicitud. Si la clave: sesión está presente en el mapa de respuesta, se almacenará para la próxima solicitud realizada por el usuario actual. Mientras que el middleware de seguimiento de pila capturará cualquier excepción que ocurra mientras procesa la solicitud y generará un seguimiento de pila que se envía de vuelta como respuesta si se produce alguna excepción.
Trabajar directamente con Ring puede ser tedioso, por lo que Compojure se basa en Ring abstrayendo los detalles. La aplicación ahora se puede expresar en términos de enrutamiento para que pueda tener algo como esto:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure sigue trabajando con los mapas de solicitud / respuesta para que siempre pueda acceder a ellos si es necesario:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
En este caso, la parte {uri: uri} accede a la clave: uri en el mapa de solicitud y establece uri en ese valor.
El último componente es Hiccup, lo que facilita la generación del html. Las diversas etiquetas html se representan como vectores con el primer elemento que representa el nombre de la etiqueta y el resto es el cuerpo de la etiqueta. "<h2>A header</h2>"
se convierte [:h2 "A Header"]
. Los atributos de una etiqueta están en un mapa opcional. "<a href='/login'>Log In Page</a>"
se convierte [:a {:href "/login"} "Log In Page"]
. Aquí hay un pequeño ejemplo usando una plantilla para generar el html.
(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))
(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))
(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))
Aquí hay un enlace a un borrador de una documentación que el autor del compuesto está redactando actualmente y que puede resultarle útil: Doc. Compojure