Skip to content

Instantly share code, notes, and snippets.

@zehnpaard
Created October 30, 2016 06:03
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zehnpaard/665edf183818b4df707b5f0535ecdc0c to your computer and use it in GitHub Desktop.
Save zehnpaard/665edf183818b4df707b5f0535ecdc0c to your computer and use it in GitHub Desktop.
Simple Compojure Demo with GET/POST forms
(ns simple-compojure.core
(require
[ring.adapter.jetty :refer [run-jetty]]
[ring.middleware.params :as p]
[simple-compojure.middleware :as m]
[simple-compojure.routes :as r]
))
(def app
(-> r/routes
m/logger
m/req-res-displayer
p/wrap-params))
(defonce server
(run-jetty #'app {:port 8080 :join? false}))
(ns simple-compojure.middleware)
(defonce log-atom (atom []))
(defn logger [handler]
(fn [req]
(let [res (handler req)]
(swap! log-atom #(conj % {:request req :response res}))
res)))
(defn req-res-displayer [handler]
(fn [req]
(let [res (handler req)]
(println "\nRequest:")
(clojure.pprint/pprint req)
(println "\nResponse:")
(clojure.pprint/pprint res)
res)))
(defproject simple-compojure "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.7.0"]
[ring "1.5.0"]
[compojure "1.5.1"]])
(ns simple-compojure.routes
(require
[compojure.core :refer [defroutes GET POST]]
[compojure.route :refer [not-found]]
[simple-compojure.views :as v]
))
(defroutes routes
(GET "/" req (v/main req))
(GET "/get-form.html" req (v/get-form req))
(GET "/post-form.html" req (v/post-form req))
(GET "/get-submit" req (v/display-result req))
(POST "/post-submit" req (v/display-result req))
(not-found (v/not-found)))
(ns simple-compojure.views)
(defn main [req]
"<div>
<h1>Hello Web Page with Routing!</h1>
<p>What would you like to do?</p>
<p><a href='./get-form.html'>Submit a GET request</a></p>
<p><a href='./post-form.html'>Submit a POST request</a></p>
</div>")
(defn get-form [req]
"<div>
<h1>Hello GET Form!</h1>
<p>Submit a message with GET</p>
<form method=\"get\" action=\"get-submit\">
<input type=\"text\" name=\"name\" />
<input type=\"submit\" value\"submit\" />
</form>
<p><a href='..'>Return to main page</p>
</div>")
(defn post-form [req]
"<div>
<h1>Hello POST Form!</h1>
<p>Submit a message with POST</p>
<form method=\"post\" action=\"post-submit\">
<input type=\"text\" name=\"name\" />
<input type=\"submit\" value\"submit\" />
</form>
<p><a href='..'>Return to main page</p>
</div>")
(defn display-result [req]
(let [{:keys [params uri]} req
param-name (get params "name")
req-type (if (= uri "/get-submit") "GET" "POST")]
(str
"<div>
<h1>Hello " param-name "!</h1>
<p>Submitted via a " req-type " request.</p>
<p><a href='..'>Return to main page</p>
</div>")))
(defn not-found []
"<h1>404 Error!</h1>
<b>Page not found!</b>
<p><a href='..'>Return to main page</p>")
@brandonmack111
Copy link

This is lovely, and very helpful for what I'm working on. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment