Compojure вже не є повноцінною основою для розробки веб-додатків. З моменту випуску 0.4 compojure було розбито на кілька проектів.
Кільце забезпечує основу, відволікаючи HTTP-запит та процес відповіді. Ring розбере вхідний запит і сформує карту, що містить усі частини запиту, такі як uri, ім'я сервера та метод запиту. Потім додаток буде обробляти запит і на основі запиту генерувати відповідь. Відповідь представлена у вигляді карти, що містить такі клавіші: статус, заголовки та тіло. Таким простим додатком виглядатиме так:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ще одна частина Кільця - це концепція середнього посуду. Це код, який знаходиться між обробником та вхідним запитом та / або вихідною відповіддю. Деякі вбудовані в середній посуд включають сеанси та стек-трек. Середня частина сеансу додасть ключ: сеанс до карти запиту, який містить всю інформацію про сеанс для користувача, який робить запит. Якщо на карті відповідей присутній ключ: сеанс, він буде зберігатися для наступного запиту, зробленого поточним користувачем. У той час як середнє програмне забезпечення трасування стека буде фіксувати будь-які винятки, що виникають під час обробки запиту, та генеруватиме стежку стека, яка буде відправлена назад як відповідь, якщо трапляються винятки.
Робота безпосередньо з Кільцем може бути втомливою, тому Compojure побудований на вершині Кільця, відводячи деталі. Тепер додаток можна виразити у вигляді маршрутизації, щоб ви могли мати щось подібне:
(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