Yep, basically you want something like this:
(use 'clojure.contrib.json.read)
(use 'clojure.contrib.duck-streams)
(defn json-request? [request]
(= (get-in request [:headers "content-type"])
"application/json"))
(defn assoc-json [request]
(if (json-request? request)
(assoc request :json (read-json (slurp* (request :body))))
request))
(defn with-json [handler]
(fn [request]
(handler (assoc-json request))))
And then just decorate your handlers with the with-json middleware:
(defroutes your-routes
(POST "/test"
(str "You posted: " (pr-str (request :json))))
(ANY "*"
[404 "Resource not found"]))
(decorate your-routes
with-json)
- James