Compojure больше не является полноценной платформой для разработки веб-приложений. Начиная с версии 0.4, compojure был разбит на несколько проектов.
Кольцо обеспечивает основу, абстрагируя процесс HTTP-запроса и ответа. Ring проанализирует входящий запрос и сгенерирует карту, содержащую все части запроса, такие как uri, server-name и request-method. Затем приложение будет обрабатывать запрос и на основании запроса генерировать ответ. Ответ представляется в виде карты, содержащей следующие ключи: статус, заголовки и тело. Таким образом, простое приложение будет выглядеть так:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Еще одна часть Кольца - концепция промежуточного программного обеспечения. Это код, который находится между обработчиком и входящим запросом и / или исходящим ответом. Некоторые встроенные промежуточные программы включают сессии и трассировку стека. Промежуточное программное обеспечение сеанса добавит: ключ сеанса к карте запроса, которая содержит всю информацию о сеансе для пользователя, выполняющего запрос. Если ключ: сеанс присутствует в карте ответов, он будет сохранен для следующего запроса, сделанного текущим пользователем. Промежуточное программное обеспечение трассировки стека будет фиксировать любые исключения, возникающие при обработке запроса, и генерирует трассировку стека, которая отправляется обратно в качестве ответа, если какие-либо исключения возникают.
Работа непосредственно с Ring может быть утомительной, поэтому Compojure построен поверх Ring, абстрагируя детали. Теперь приложение можно выразить в терминах маршрутизации, чтобы вы могли получить что-то вроде этого:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure по-прежнему работает с картами запросов / ответов, поэтому вы всегда можете получить к ним доступ при необходимости:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
В этом случае часть {uri: uri} обращается к ключу: uri в карте запросов и устанавливает для uri это значение.
Последний компонент - Hiccup, который облегчает генерацию HTML. Различные HTML-теги представлены в виде векторов, причем первый элемент представляет имя тега, а остальные - тело тега. "<h2>A header</h2>"
становится [:h2 "A Header"]
. Атрибуты тега находятся на дополнительной карте. "<a href='/login'>Log In Page</a>"
становится [:a {:href "/login"} "Log In Page"]
. Вот небольшой пример использования шаблона для генерации 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)))
Вот ссылка на черновик некоторой документации, которая в настоящее время пишется автором compojure, которая может оказаться вам полезной: Compojure Doc