O Compojure não é mais uma estrutura completa para o desenvolvimento de aplicativos da web. Desde o lançamento do 0.4, o compojure foi dividido em vários projetos.
O Ring fornece a base abstraindo o processo de solicitação e resposta HTTP. O Ring analisará a solicitação recebida e gerará um mapa contendo todas as partes da solicitação, como uri, server-name e request-method. O aplicativo manipulará a solicitação e, com base na solicitação, gerará uma resposta. Uma resposta é representada como um mapa que contém as seguintes chaves: status, cabeçalhos e corpo. Portanto, um aplicativo simples se pareceria com:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Uma outra parte do Ring é o conceito de middleware. Este é o código que fica entre o manipulador e a solicitação de entrada e / ou a resposta de saída. Alguns embutidos no middleware incluem sessões e stacktrace. O middleware da sessão adicionará uma chave: session ao mapa da solicitação que contém todas as informações da sessão para o usuário que está fazendo a solicitação. Se a chave: session estiver presente no mapa de resposta, ela será armazenada para a próxima solicitação feita pelo usuário atual. Enquanto o middleware do rastreio da pilha captura todas as exceções que ocorrem durante o processamento da solicitação e gera um rastreio da pilha que é enviado de volta como resposta, se ocorrer alguma exceção.
Trabalhar diretamente com o Ring pode ser entediante, então o Compojure é construído sobre o Ring, abstraindo os detalhes. O aplicativo agora pode ser expresso em termos de roteamento, para que você possa ter algo assim:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
O Compojure ainda está trabalhando com os mapas de solicitação / resposta para que você sempre possa acessá-los, se necessário:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Nesse caso, a parte {uri: uri} acessa a chave: uri no mapa de solicitação e define uri para esse valor.
O último componente é o Hiccup, que facilita a geração do html. As várias tags html são representadas como vetores, com o primeiro elemento representando o nome da tag e o restante sendo o corpo da tag. "<h2>A header</h2>"
torna-se [:h2 "A Header"]
. Os atributos de uma tag estão em um mapa opcional. "<a href='/login'>Log In Page</a>"
torna-se [:a {:href "/login"} "Log In Page"]
. Aqui está um pequeno exemplo usando um modelo para gerar o 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)))
Aqui está um link para um rascunho de alguma documentação atualmente sendo escrita pelo autor do compojure que você pode achar útil: Documento Compojure