Compojure ist kein vollständiges Framework mehr für die Entwicklung von Webanwendungen. Seit der Veröffentlichung von 0.4 wurde compojure in mehrere Projekte aufgeteilt.
Ring bietet die Grundlage, indem der HTTP-Anforderungs- und Antwortprozess abstrahiert wird. Ring analysiert die eingehende Anfrage und generiert eine Karte, die alle Teile der Anfrage wie uri, Servername und Anforderungsmethode enthält. Die Anwendung verarbeitet dann die Anforderung und generiert basierend auf der Anforderung eine Antwort. Eine Antwort wird als Karte dargestellt, die die folgenden Schlüssel enthält: Status, Überschriften und Text. Eine einfache Anwendung würde also so aussehen:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ein weiterer Teil von Ring ist das Konzept der Mittelware. Dies ist Code, der sich zwischen dem Handler und der eingehenden Anforderung und / oder der ausgehenden Antwort befindet. Einige integrierte Middleware-Funktionen umfassen Sessions und Stacktrace. Die Sitzungs-Middleware fügt der Anforderungszuordnung einen: Sitzungsschlüssel hinzu, der alle Sitzungsinformationen für den Benutzer enthält, der die Anforderung stellt. Wenn der Sitzungsschlüssel: in der Antwortzuordnung vorhanden ist, wird er für die nächste Anforderung des aktuellen Benutzers gespeichert. Während der Stack-Trace Middleware alle Ausnahmen erfasst, die während der Verarbeitung der Anforderung auftreten, wird ein Stack-Trace generiert, der als Antwort zurückgesendet wird, wenn Ausnahmen auftreten.
Die direkte Arbeit mit Ring kann mühsam sein, daher baut Compojure auf Ring auf und abstrahiert die Details. Die Anwendung kann jetzt als Routing ausgedrückt werden, sodass Sie Folgendes haben können:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure arbeitet weiterhin mit den Anforderungs- / Antwortzuordnungen, sodass Sie bei Bedarf jederzeit darauf zugreifen können:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
In diesem Fall greift der Teil {uri: uri} auf den Schlüssel: uri in der Anforderungszuordnung zu und setzt uri auf diesen Wert.
Die letzte Komponente ist Hiccup, was das Generieren des HTML erleichtert. Die verschiedenen HTML-Tags werden als Vektoren dargestellt, wobei das erste Element den Tag-Namen darstellt und der Rest der Hauptteil des Tags ist. "<h2>A header</h2>"
wird [:h2 "A Header"]
. Die Attribute eines Tags befinden sich in einer optionalen Zuordnung. "<a href='/login'>Log In Page</a>"
wird [:a {:href "/login"} "Log In Page"]
. Hier ist ein kleines Beispiel mit einer Vorlage zum Generieren des 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)))
Hier ist ein Link zu einem groben Entwurf einiger Dokumentationen, die derzeit vom Autor von compojure verfasst werden und die Sie möglicherweise hilfreich finden: Compojure Doc