Compojure n'est plus un framework complet pour développer des applications web. Depuis la version 0.4, compojure a été décomposé en plusieurs projets.
Ring fournit la base en faisant abstraction du processus de demande et de réponse HTTP. Ring analysera la demande entrante et générera une carte contenant toutes les parties de la demande telles que l'URI, le nom du serveur et la méthode de la demande. L'application traitera alors la demande et, sur la base de la demande, générera une réponse. Une réponse est représentée sous la forme d'une carte contenant les clés suivantes: état, en-têtes et corps. Une application simple ressemblerait donc à:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Une autre partie de Ring est le concept de middleware. Il s'agit d'un code situé entre le gestionnaire et la demande entrante et / ou la réponse sortante. Certains middlewares intégrés incluent des sessions et stacktrace. Le middleware de session ajoutera une clé: session à la mappe de requête qui contient toutes les informations de session pour l'utilisateur effectuant la requête. Si la clé: session est présente dans la mappe de réponse, elle sera stockée pour la prochaine demande faite par l'utilisateur actuel. Alors que le middleware de trace de pile capturera toutes les exceptions qui se produisent lors du traitement de la demande et générera une trace de pile qui sera renvoyée comme réponse si des exceptions se produisent.
Travailler directement avec Ring peut être fastidieux, donc Compojure est construit au-dessus de Ring en abstraction des détails. L'application peut maintenant être exprimée en termes de routage afin que vous puissiez avoir quelque chose comme ceci:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure travaille toujours avec les cartes de demande / réponse afin que vous puissiez toujours y accéder si nécessaire:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Dans ce cas, la partie {uri: uri} accède à la clé: uri dans la mappe de demande et définit uri sur cette valeur.
Le dernier composant est Hiccup qui facilite la génération du HTML. Les différentes balises html sont représentées comme des vecteurs, le premier élément représentant le nom de la balise et le reste étant le corps de la balise. "<h2>A header</h2>"
devient [:h2 "A Header"]
. Les attributs d'une balise sont dans une carte facultative. "<a href='/login'>Log In Page</a>"
devient [:a {:href "/login"} "Log In Page"]
. Voici un petit exemple utilisant un modèle pour générer le 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)))
Voici un lien vers un brouillon de certains documents en cours de rédaction par l'auteur de compojure qui pourraient vous être utiles: Compojure Doc