Compojure non è più un framework completo per lo sviluppo di applicazioni Web. Dalla versione 0.4, la composizione è stata suddivisa in diversi progetti.
Ring fornisce le basi sottraendo il processo di richiesta e risposta HTTP. Ring analizzerà la richiesta in arrivo e genererà una mappa contenente tutte le parti della richiesta come uri, nome server e metodo richiesta. L'applicazione gestirà quindi la richiesta e in base alla richiesta genererà una risposta. Una risposta è rappresentata come una mappa contenente i seguenti tasti: stato, intestazioni e corpo. Quindi una semplice applicazione sarebbe simile a:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Un'altra parte di Ring è il concetto di middleware. Questo è il codice che si trova tra il gestore e la richiesta in arrivo e / o la risposta in uscita. Alcuni middleware integrati includono sessioni e stacktrace. Il middleware di sessione aggiungerà una: chiave di sessione alla mappa di richiesta che contiene tutte le informazioni sulla sessione per l'utente che effettua la richiesta. Se la chiave di sessione è presente nella mappa di risposta, verrà memorizzata per la richiesta successiva effettuata dall'utente corrente. Mentre il middleware di traccia dello stack acquisirà eventuali eccezioni che si verificano durante l'elaborazione della richiesta e genererà una traccia di stack che viene restituita come risposta se si verificano eccezioni.
Lavorare direttamente con l'Anello può essere noioso, quindi Compojure è costruito sulla parte superiore dell'Anello per sottrarre i dettagli. L'applicazione ora può essere espressa in termini di routing in modo da poter avere qualcosa del genere:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure sta ancora lavorando con le mappe di richiesta / risposta, quindi puoi sempre accedervi se necessario:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
In questo caso la parte {uri: uri} accede alla chiave: uri nella mappa della richiesta e imposta uri su quel valore.
L'ultimo componente è il singhiozzo che semplifica la generazione dell'html. I vari tag html sono rappresentati come vettori con il primo elemento che rappresenta il nome del tag e il resto è il corpo del tag. "<h2>A header</h2>"
diventa [:h2 "A Header"]
. Gli attributi di un tag sono in una mappa opzionale. "<a href='/login'>Log In Page</a>"
diventa [:a {:href "/login"} "Log In Page"]
. Ecco un piccolo esempio che utilizza un modello per generare l'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)))
Ecco un link a una bozza di alcuni documenti attualmente scritti dall'autore di compojure che potresti trovare utili: Compojure Doc